1. 程式人生 > >tcl/tk例項詳解——返回一個資料夾下所有檔案的絕對路徑

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過程
   #如果是檔案直接把路徑記錄到結果檔案中

   foreach myfile [glob -nocomplain *] {
       #進入遞迴後有可能修改當前的目錄,
       #因為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