2016-12-22 41 views
1

各実行サイクルで非常に大量になるウィンドウで%TEMP%dirを再帰的に削除する小さなprocを作成しました。 しかし、それは遅く動作するように思われました - 手動で%TEMP%パス内の別のフォルダを手動で選択して削除を実行する方が速かったです。 スレッド/ pthreadを使用して、並行してフォルダを削除する可能性はありますか? または代替ソリューション。 次のコードでヘルプが必要です。Tcl:ディレクトリを再帰的に削除する - スレッドを使用してパフォーマンスを改善する

まあ
proc DirRecursion {dir args} {  
    set options(-files) "" 
    set options(-fileTypesFilter) "ALL" 
    array set options $args 
    upvar $options(-files) lf 
    #Performing action deletion on files for dir $dir ... please be patient as this might take some time 
    if ![catch { append lf " [glob -directory $dir -type f *]"}] { 
     } "Found following files to delete in dir $dir" 
     foreach f [set lf [regsub -all {\\} $lf {/}]] { 
      catch {file delete -force $f} 
     }    
    } 
    if ![catch { set ld [glob -directory $dir -type d *]}] { 
     foreach d $ld { 
      DirRecursion $d -files lf    
     } 
    } else { 
     puts "No directories to delete in dir $dir" debug 
    } 
    catch {file delete -force $dir} 
} 
+1

並行してディレクトリ全体を削除することはこれまでどおり高速になるとは思いません。速度はディスクドライブによって制限されます。 –

+0

'lf'を文字列として扱う代わりに、リストを作成する方が良いでしょう。 'lappend'を使ってください。今のところ、スペースが埋め込まれたファイル名を壊す可能性があります。 'regsub'も必要ありません。 'ファイルの削除はネイティブの名前を扱うことができます。また、次のDirRecursionの呼び出しで上のディレクトリからファイルリストを渡しているようです。 –

答えて

3

、あなたがボトルネックでも、ディスクの実際の読み込みと書き込みになりますので、(おそらくthread poolfile delete -forceに要求を送信することにより)、それがすべてで助けて非常にそうだと行うことができますSSDを搭載したシステムではHDDを使うと、間違いなくあなたが待っていることになります。

file delete -forceは既に再帰的削除のケースを処理しています。おそらくあなたが書いたものより速いでしょう。

file delete -force {*}[glob -directory $::env(TEMP) *] 

かの内容を削除します。私はあなたが実際に(それはあまりにもあなたのセッションで他のプログラムに少し特別だとして)%TEMP%パス自体を削除したくない、あなたの代わりにこのような何かを行うことができます疑いがあるので、代わりに適切なサブディレクトリ。代わりに、複雑な手順の一つの行...

編集

これは、個別に各エントリを削除しようとすると、ディレクトリが原因権限エラーに削除できない場合でも続行します。

foreach {entry} [glob -directory $::env(TEMP) *] { 
    catch { file delete -force $entry } 
} 
+0

削除できないファイルのエラーをクリーンアップのためにスキップしたいだけです。上記のコマンドは最初のエラーで停止します – BabyGroot

関連する問題