tcl/tk例項詳解——返回一個資料夾下所有檔案的絕對路徑
#所有程式碼如下,使用註釋的方式講解指令碼
#修改好資料夾和儲存結果路徑,可以把本檔案直接拷貝進tcl直譯器執行
#指令碼目的:返回一個資料夾下所有的檔案的絕對路徑
#主要講述和操作的命令cd、pwd、glob
#次要命令:file、open、catch
#指令碼思想:使用遞迴返回所有的檔案路徑,可以遍歷到所有的子資料夾
#指令碼以在window目錄下為例,需要在其它系統下請修改路徑名
#需要返回檔案路徑的資料夾,需要注意在windows下路徑名用/間隔,tcl語言中用/間隔
set dirpath "D:/Script.NET/V2"
#進入資料夾中
cd $dirpath
pwd
#結果儲存在檔案中,此處以windows系統下為例
set resultfile "C:/result.txt"
#開啟儲存結果的檔案
#catch用於捕捉髮生的錯誤,使指令碼不會應為錯誤而中斷,指令碼中捕捉到錯誤會使用exit退出
#result變數儲存開啟的結果檔案I/O通道ID
if { [catch {set result [open $resultfile w+]} err] } {
puts $err
exit
}
#用於返回檔案路徑名的過程
#myDir需要返回檔案路徑的資料夾名
#result為儲存結果的檔案I/O通道ID
proc FindFile { myDir result } {
#進入目錄
if {[catch {cd $myDir} err]} {
puts $result $err
return
}
#遍歷目錄中所有檔案和資料夾
#如果是資料夾則遞迴呼叫FindFile過程
#如果是檔案直接把路徑記錄到結果檔案中
#進入遞迴後有可能修改當前的目錄,
#因為file命令只能對當前路徑有效果,
#所以需要保證在正確的目錄下操作檔案
cd $myDir
#如果資料夾是空的,則會返回空,不記錄資料夾
if {[string equal $myfile ""]} {
return
}
set fullfile [file join $myDir $myfile]
#判斷是資料夾還是檔案
#如果是資料夾則遞迴呼叫FindFile過程
#如果是檔案直接把路徑記錄到結果檔案中
if {[file isdirectory $myfile]} {
puts $result $fullfile
FindFile $fullfile $result
} else {
puts $result $fullfile
}
}
}
#執行指令碼命令,返回結果
FindFile $dirpath $result
#關閉儲存結果的檔案I/O通道
close $result