2017-08-24 102 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) 
}