删除多个文件使用C#的速度有多快

时间:2017-06-22 12:18:33

标签: c# directory

A在Windows Server中有一个文件夹,包含子文件夹和~50000个文件。当我单击鼠标右键并选择删除(或shift + delete)时 - 所有文件将在10-20秒内删除 当我使用代码删除文件 - 1500-4000秒!!!
Delete large number of files - 不要为我工作。 我的代码:

string folderPath = @"C://myFolder";
DirectoryInfo folderInfo = new DirectoryInfo(folderPath);
folderInfo.Delete(true); // true - recursive, with sub-folders

如何更快地删除文件?

3 个答案:

答案 0 :(得分:4)

更快的删除文件的方法是使用Windows函数而不是.NET函数。

您需要先导入该功能:

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool DeleteFile(string lpFileName);

然后你可以这样做:

string[] files = Directory.EnumerateFiles(path, "*". SearchOption.AllDirectories);

foreach (string file in files)
{
    DeleteFile(file);
}

删除文件后,这是使用托管API最慢的部分,您可以调用Directory.DeleteFolder(path, true)删除空文件夹。

答案 1 :(得分:1)

由于问题实际上是关于删除网络共享文件夹,并且它声明基于资源管理器的删除比C#内部删除机制快得多,因此调用基于Windows shell的删除可能会有所帮助。

ProcessStartInfo Info = new ProcessStartInfo(); 
Info.Arguments = "/C rd /s /q \"<your-path>\""; 
Info.WindowStyle = ProcessWindowStyle.Hidden; 
Info.CreateNoWindow = true; 
Info.FileName = "cmd.exe"; 
Process.Start(Info);

当然,你必须替换<your-path>

但是,我现在没有可用于测试性能的基础架构和文件。

答案 2 :(得分:0)

当删除具有大量文件和子文件夹的文件夹时,DirectoryInfo.Delete()方法为什么花费太多时间并不十分清楚。我怀疑这个方法也可以做很多不必要的事情。

我写了一个小类来使用Win API,而没有做太多不必要的事情来测试我的想法。删除包含50,000个文件子文件夹的文件夹大约需要40秒。所以,希望它有所帮助。

我使用此PowerScript生成测试文件。

File "C:/Users/Admin/PycharmProjects/temp2/Pydelicious.py", line 2, in <module>
pydelicious.get_popular(tag = 'programming')
File "build\bdist.win32\egg\pydelicious\__init__.py", line 985, in get_popular
File "build\bdist.win32\egg\pydelicious\__init__.py", line 969, in getrss
File "build\bdist.win32\egg\pydelicious\__init__.py", line 447, in dlcs_rss_request


File "build\bdist.win32\egg\pydelicious\__init__.py", line 227, in http_request
pydelicious.PyDeliciousException: HTTP Error 404: Not Found

以下是C#中的代码。

$folder = "d:\test1";
For ($i=0; $i -lt 50000; $i++)
{
    New-Item -Path $folder -Name "test$i.txt" -ItemType "file" -Value $i.ToString();
}