Я посмотрел и не нашел способа получить имя файла из дескриптора, поэтому я создал собственное решение. Это решение использует команду trace для перехвата при выходе из команды open . В это время доступны имена и дескрипторы файлов, поэтому я связываю их друг с другом через глобальный массив fileNameFromHandle .
# This script demonstrate the use of the trace command to keep track
# the relationship between file handles and file names
# ======================================================================
# Setup trace to track file handle vs. file name
array set fileNameFromHandle {}
proc trace_proc {command code result op} {
if {$code != 0} return; # Ignore failed calls
set filename [lindex $command 1]; # command = {open filename mode}
set filehandle $result
set ::fileNameFromHandle($filehandle) $filename
}
proc getFileName {handle} { return $::fileNameFromHandle($handle) }
trace add execution open leave trace_proc
# ======================================================================
# Main
set handle1 [open file1.txt r]
# Do something with the files
# Need filename from handle?
puts "Handle: $handle1, filename: [getFileName $handle1]"
close $handle1
Обновление
У меня нет Tcl 8.0.5, чтобы проверить, работает ли это решение. Пожалуйста, попробуйте и дайте мне знать. Вы также можете отследить команду close , чтобы удалить связь.