从文件句柄值中获取文件名
get the file name from the file handle value
假设我有一个文件句柄。有没有办法让我知道它正在写入的文件的名称?
即,您通常使用:
set fh [ open "fname" "w" ]
我想要一个具有输出的过程:
puts [ getFHFName $fh]
>fname
有什么想法吗?
Tcl 不提供任何内置机制来提供它。 (如果我们这样做了,您可以通过 fconfigure
找到它……但事实并非如此。)
最简单的解决方法是保留一个从文件句柄映射到文件名的全局数组。您可以自己保留它,也可以覆盖 open
和 close
以维护映射。
rename open _open
rename close _close
array set fhmap {}
proc open {filename args} {
global fhmap
set fd [_open $filename {*}$args]
# Note! Do not normalise pipelines!
if {![string match |* $filename]} {
set filename [file normalize $filename]
}
set fhmap($fd) $filename
return $fd
}
# Probably ought to track [chan close] too.
proc close {filehandle args} {
global fhmap
# Note that we use -nocomplain because of sockets.
unset -nocomplain fhmap($filehandle)
tailcall _close $filehandle {*}$args
}
proc getFHFName {filehandle} {
global fhmap
return $fhmap($filehandle)
}
假设我有一个文件句柄。有没有办法让我知道它正在写入的文件的名称? 即,您通常使用:
set fh [ open "fname" "w" ]
我想要一个具有输出的过程:
puts [ getFHFName $fh]
>fname
有什么想法吗?
Tcl 不提供任何内置机制来提供它。 (如果我们这样做了,您可以通过 fconfigure
找到它……但事实并非如此。)
最简单的解决方法是保留一个从文件句柄映射到文件名的全局数组。您可以自己保留它,也可以覆盖 open
和 close
以维护映射。
rename open _open
rename close _close
array set fhmap {}
proc open {filename args} {
global fhmap
set fd [_open $filename {*}$args]
# Note! Do not normalise pipelines!
if {![string match |* $filename]} {
set filename [file normalize $filename]
}
set fhmap($fd) $filename
return $fd
}
# Probably ought to track [chan close] too.
proc close {filehandle args} {
global fhmap
# Note that we use -nocomplain because of sockets.
unset -nocomplain fhmap($filehandle)
tailcall _close $filehandle {*}$args
}
proc getFHFName {filehandle} {
global fhmap
return $fhmap($filehandle)
}