2017-08-24 98 views
0

假设我有一个文件句柄。有没有办法让我知道它正在写入的文件的名称? 即,您通常使用:从文件句柄值中获取文件名

set fh [ open "fname" "w" ] 

我想一个进程,将有输出:

puts [ getFHFName $fh] 
>fname 

任何想法?

回答

3

Tcl没有提供任何内置机制来提供该功能。 (如果我们确实这么做的话,那么你可以用fconfigure找到它,但事实并非如此)。

最简单的解决方法是保留一个从文件句柄映射到文件名的全局数组。您可以自己保留此信息,也可以覆盖openclose以维护该映射。

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) 
}