Tcl 如何检查文件是否已关闭

Tcl 如何检查文件是否已关闭,tcl,Tcl,如何检查文件是否已关闭 例如: set fh [open "some_test_file" "w"] puts $fh "Something" close $fh 现在我想检查$fh频道是否关闭 命令: file channels $fh 不返回任何内容,因此我无法在任何情况下使用它。如果close命令没有返回错误,则它是成功的。文件通道命令不带参数,只返回所有打开的通道,因此[file channels]中的$channel将是一个冗余测试,以确保关闭通道。但是,相信close命令的非错

如何检查文件是否已关闭

例如:

set fh [open "some_test_file" "w"]
puts $fh "Something"
close $fh
现在我想检查$fh频道是否关闭 命令:

file  channels $fh

不返回任何内容,因此我无法在任何情况下使用它。

如果close命令没有返回错误,则它是成功的。
文件通道
命令不带参数,只返回所有打开的通道,因此[file channels]中的
$channel将是一个冗余测试,以确保关闭通道。但是,相信close命令的非错误响应如何


我必须纠正我自己的错误——经过一点检查,文件通道命令可以采用通道名称的可选模式(glob表达式)返回。因此,如果文件仍处于打开状态,则原始示例将起作用。您可以使用
文件通道std*
在tclsh解释器中测试这一点。但是,如果关闭通道失败,close命令仍将返回一个可捕获的错误,这也将允许您潜在地处理此类错误(可能稍后重试)。如果close命令未返回错误,则它是成功的。
文件通道
命令不带参数,只返回所有打开的通道,因此[file channels]
中的
$channel将是一个冗余测试,以确保关闭通道。但是,相信close命令的非错误响应如何


我必须纠正我自己的错误——经过一点检查,文件通道命令可以采用通道名称的可选模式(glob表达式)返回。因此,如果文件仍处于打开状态,则原始示例将起作用。您可以使用
文件通道std*
在tclsh解释器中测试这一点。但是,close命令仍将返回一个错误,如果它无法关闭通道,则可以捕获该错误,这也将允许您潜在地处理此类错误(可能稍后重试一些错误)。

您还可以使用以下方法:

proc is_open {chan} {expr {[catch {tell $chan}] == 0}}

您还可以使用以下内容:

proc is_open {chan} {expr {[catch {tell $chan}] == 0}}

为什么不将频道名称放入变量中,使关闭代码取消设置该变量,如果
[close]
成功,则在检查代码中只检查变量不存在(即取消设置)


请注意,我遵循的是在系统编程中发现的一种更为普遍的做法:一旦关闭操作系统文件句柄,它就变得无效,因此对它的所有访问都是无效的。因此,您可以使用其他方式来表示句柄不再与文件关联。

为什么不将频道名称放入变量中,使关闭代码取消设置该变量,如果
[close]
成功,则在检查代码中只检查变量不存在(即取消设置)


请注意,我遵循的是在系统编程中发现的一种更为普遍的做法:一旦关闭操作系统文件句柄,它就变得无效,因此对它的所有访问都是无效的。因此,您可以使用其他方法来表示句柄不再与文件关联。

实际上发现catch命令在这里有帮助,但可能有一个更有趣的解决方案,实际发现catch命令在这里有帮助,但可能有一个更有趣的解决方案,我在不同的过程中关闭文件,在当前过程中只希望签入文件已关闭的条件。我在不同的过程中关闭文件,在当前过程中只希望签入文件已关闭的条件。