2013-05-09 29 views
0

我想通過tcl proggraming複製文件,這些文件是鏈接的。 這是代碼:如何通過tcl複製鏈接的文件

if { [file type $sfile] == "link" } { 
     set fget [file readlink $sfile ] 
     }   
     file copy -force $fget $dir 

它工作,如果$ sfile是一個鏈接。如果鏈接的源文件也是鏈接,這不起作用。

我該如何遞歸追蹤符號鏈接?

+0

從[tcllib的'fileutil'模塊](http://core.tcl.tk/tcllib/doc/trunk/embedded/www/toc1.html) – 2013-05-09 19:48:43

回答

2

遞歸。

while {[file type $sfile] eq "link"]} { 
    set newfile [file readlink $sfile] 
    if {[string index $newfile 0] ne "/"} { 
     set newfile [file dirname $sfile]/$newfile 
    } 
    set sfile $newfile 
} 
file copy -force $sfile $dir 
+0

有'fullnormalize'過程是迂腐,這是迭代不遞歸 – 2013-05-09 19:43:22

+0

感謝您的幫助,但它並沒有..拒絕說沒有這樣的文件或目錄 – noname 2013-05-09 21:57:43

+0

我有文件A鏈接到文件B.文件B也是一個鏈接文件,鏈接到文件CI要複製文件A到特定的目錄。 – noname 2013-05-09 21:59:50

0

嗨我以前用過這個。因爲給我們的輸入是鏈接鏈接,所以我使用該過程來查找真實文件。請讓我知道這是否有助於你。

proc get_real_link {linkfile} {  
    if {[file type $linkfile] eq "link"} { 
     set tempfile [file readlink $linkfile] 
    } 
    if {[file type $tempfile] eq "link" } { 
     get_real_link $tempfile 
    } else { 
     return $tempfile 
    } 
} 

set realFile [get_real_link "new1.txt"] 

#puts "$realFile" 
file copy -force $realFile $dir 

假設:new1.txt是初始鏈接文件。沒有循環鏈接,如A-> B- B-> C- C-> A。

+0

因此,這和我做的事情基本上是一樣的,添加一些不必要的額外文件類型檢查,使用了堆棧,除了我的解決方案沒有其他好處嗎? (好吧,當有循環鏈接時,你的解決方案會崩潰,我的意志會繼續前進並運行) – 2013-05-16 12:38:21