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
如何更快地删除文件?
答案 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();
}