Tcl:递归删除目录 - 使用线程提高性能

时间:2016-12-22 12:06:28

标签: pthreads tcl

我写了一个小程序,以递归方式删除Windows上的%TEMP%目录,这在每个执行周期都非常笨重。 但它似乎运行缓慢 - 在%TEMP%路径中手动选择不同的文件夹并在其上运行删除更快。 是否有可能使用线程/ pthreads并行删除文件夹。 或者替代解决方案。 需要以下代码的帮助。

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 :(得分:3)

好吧,你可能这样做(可能是通过向file delete -force发送请求到thread pool),因为瓶颈问题,它根本不可能提供帮助将在磁盘的实际读写中,即使在具有SSD的系统上也是如此。使用硬盘驱动器,这绝对是您将要等待的。

您知道file delete -force已处理递归删除案例吗?它可能比你写的更快。由于我怀疑你实际上并不想删除%TEMP%路径本身(因为这对你会话中的其他程序来说有点特殊),你可以这样做:

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

或者删除相应子目录的内容。一行而不是复杂的程序...

修改

这将尝试单独删除每个条目,即使由于权限错误而无法删除目录,也会继续。

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