以相反的顺序删除文件

时间:2013-06-03 15:14:53

标签: batch-file delete-file

我必须每天删除大量文件(200k +),所以我写了一个批处理文件来执行以下调用:

del *.* /S /F /Q

我不关心生成的任何文件,因此*.*没问题。文件按字母顺序删除,但它们仍然需要几分钟,我想加快速度。我以反向字母顺序删除文件会很好,因为我可以并行执行两个批处理文件。我知道一个python脚本会让它变得容易,但我想知道是否有办法在批处理文件中执行此操作。如果你有一个更简单的方法,我愿意接受建议。

1 个答案:

答案 0 :(得分:0)

我设计了一个多线程解决方案,可以充分利用不同时间设备中可能出现的未使用时间间隔。这个想法是以最大速度运行该过程,允许最慢的设备(即:硬盘)在连续使用时没有暂停。当然,这种方法的结果完全取决于计算机硬件。

下面的批处理文件在第一个参数中包含将要创建的异步线程的数量。这样,文件总数将除以此数字,每个生成的文件块将由不同的同时线程处理。

@echo off
setlocal EnableDelayedExpansion

rem Multi-thread file deleting program
if "%1" equ "Thread" goto ProcessBlock

rem Create the list of file names and count they
cd C:\TheFolder
set numFiles=0
(for /F "delims=" %%f in ('dir /S /A-D *.*') do (
   echo %%f
   set /A numFiles+=1
)) > "%temp%\fileNames.tmp"

rem Get number of threads and size of each block
set numThreads=%1
if not defined numThreads (
   set /A numThreads=1, blockSize=numFiles
) else (
   set /A blockSize=numFiles/numThreads
)

rem Create asynchronous threads to process block number 2 up to numThreads
if exist thread.* del thread.*
for /L %%t in (2,1,%numThreads%) do (
   echo %time% > thread.%%t
   start "" /B "%~F0" Thread %%t
)

rem Process block number 1
set count=0
for /F "usebackq delims=" %%f in ("%temp%\fileNames.tmp") do (
   del "%%f"
   set /A count+=1
   if !count! equ %blockSize% goto endFirstBlock
)

:endFirstBlock

rem Wait for all asynchronous threads to end
if exist thread.* goto endFirstBlock

rem Delete the auxiliary file and terminate
del "%temp%\fileNames.tmp"
goto :EOF


rem Process blocks 2 and up (asynchronous thread)

:ProcessBlock 
set /A skip=(%2-1)*blockSize, count=0
for /F "usebackq skip=%skip% delims=" %%f in ("%temp%\fileNames.tmp") do (
   del "%%f"
   set /A count+=1
   if !count! equ %blockSize% goto endBlock
)
:endBlock
del thread.%2
exit

上述批处理文件假定文件名没有感叹号。如果需要这一点,可能会包含相应的setlocal / endlocal命令,但此详细信息会降低该过程的速度。

理想情况下,您应该使用相同的文件集进行多次计时测试,从1开始变化参数并逐渐增长,直到值给出大于前一个的时间;但是,我知道这对你来说很难。但是,每次运行程序时都可以更改参数并记下时间。如果每次运行的文件集相似,您将确定参数的最佳值。

如果您完成这些计时测试,请发布结果!我想回顾一下。