我需要帮助。 我有目录/文件路径列表,我的程序将读取每个。 不知何故,当我尝试使用下面的命令打开文件时,其中一个目录是卸载/坏磁盘并导致我的程序挂在那里。
catch {set directory_fid [open $filePath r]}
那么,在我阅读/打开文件之前,如何检查目录状态?如果在特定时间内没有响应并且继续读取下一个文件,我想跳过该文件。
* file isdir $dir
效果不佳
*当我在Unix中使用ls -dir
时也没有回复。
答案 0 :(得分:1)
在开始这条路之前,我会检查您的要求,看看是否有更简单的方法来处理这个问题。最好修复挂载,以便在进行访问尝试时不会导致挂起状态。
主要问题是对于要检查的目录,您需要知道相应的挂载点。如果您不知道挂载点,则在尝试访问时,很难判断要检查的目录是否会导致挂起。
首先,您必须解析/etc/fstab
并获取可能的文件系统挂载点列表(假设,Linux系统 - 如果不是Linux,则会有等效文件)。
其次,要查看当前安装的内容,您需要di Tcl extension (wiki page)(或main page w/download links)。 (*)。使用此扩展,您可以获得已安装文件系统的列表。
# the load only needs to be done once...
set ext [info sharedlibextension]
set lfn [file normalize [file join [file dirname [info script]] diskspace$ext]]
load $lfn
# there are various options that can be passed to the `diskspace`
# command that will change which filesystems are listed.
set fsdata [diskspace -f {}]
set fslist [dict keys $fsdata]
现在您有一个可能的挂载点列表,您知道挂载了哪些挂载点。
第三,您需要确定哪个挂载点对应于您要检查的目录。例如,如果您有:
/user/bll/source/stuff.c
您需要检查/user/bll/source
,然后/user/bll
,然后/user
,然后/
作为可能的挂载点。
这里有一个很大的假设,即文件或其任何父目录都没有符号链接到另一个地方。
确定可能的安装点后,您可以检查它是否已安装:
if { $mountpoint in $fslist } {
...
} else {
# better skip this one, the probable mount point is not mounted.
}
正如您所看到的,这是一项很多工作。很脆弱。 最好修理坐骑,这样他们就不会挂起。
(*)我写了di
和di
Tcl扩展名。这是一种便携式解决方案。您当然可以使用exec
来运行df
或mount
,但如果您使用更多手动方法,还有其他问题(解析,可移植性,确定要使用的文件系统)。