TCL帮助:如何在读取文件之前检查卸载/坏磁盘

时间:2016-08-10 09:46:15

标签: tcl

我需要帮助。 我有目录/文件路径列表,我的程序将读取每个。 不知何故,当我尝试使用下面的命令打开文件时,其中一个目录是卸载/坏磁盘并导致我的程序挂在那里。

catch {set directory_fid [open $filePath r]}

那么,在我阅读/打开文件之前,如何检查目录状态?如果在特定时间内没有响应并且继续读取下一个文件,我想跳过该文件。

* file isdir $dir效果不佳

*当我在Unix中使用ls -dir时也没有回复。

1 个答案:

答案 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.
}

正如您所看到的,这是一项很多工作。很脆弱。 最好修理坐骑,这样他们就不会挂起。

(*)我写了didi Tcl扩展名。这是一种便携式解决方案。您当然可以使用exec来运行dfmount,但如果您使用更多手动方法,还有其他问题(解析,可移植性,确定要使用的文件系统)。