基本的问题陈述是检查文件是否存在。在我的流程中,现有代码执行以下操作来检查文件是否存在。这部分代码被访问了很多次。如果需要的话,我还有一个开关可以强制在目录上执行 ls 来执行昂贵的 NFS 同步。
` proc check_file_exists { 文件名 use_ls } {
set fexists 1;
if { ![file exists $filename] } {
set fexists 0;
if { $use_ls == 1 } {
# expensive NFS sync up
set fileDir [file dirname $filename]
if { [file exists $fileDir] } {
ls $fileDir;
if { [file exists $filename] } {
set fexists 1;
}
}
}
if { $fexists == 0 } {
puts "File '${filename}' does not exist.";
}
}
return $fexists;
}`
但是上述方法的问题是,如果由于某种原因我传递了一个没有文件名的路径(仅目录),则 proc 返回 1 而不是 0。所以,我修改了代码来执行此操作 -
proc check_file_exists { 文件名 use_ls } {
set fexists 1;
set excp [catch {file size $filename} fSize];
if { ($excp != 0) || ($fSize <= 0) } {
set fexists 0;
if { $use_ls == 1 } {
# expensive NFS sync up
set fileDir [file dirname $filename]
if { [file exists $fileDir] } {
ls -d $fileDir;
set excp [catch {file size $filename} fSize];
if { ($excp == 0) && ($fSize > 0) } {
set fexists 1;
}
}
}
if { $fexists == 0 } {
puts "File '${filename}' does not exist.";
}
}
return $fexists;
}
TCL 有多贵
file size foo
。是从文件描述符读取还是动态计算大小?有没有更好的方法来处理上述场景或问题陈述?上述两段代码对于一百万个文件是否存在检查的时间复杂度是多少?
file size
命令是stat()
系统调用的包装器(当不在虚拟文件系统上时,这不适用于您的情况)。在 Windows 上,获取文件大小的调用略有不同,但工作原理类似;文件的大小是文件元数据的一部分。