我已经在stackoverflow上阅读了许多关于删除大量文件的最快方法的线程。 What's the fastest way to delete a large folder in Windows? https://superuser.com/questions/19762/mass-deleting-files-in-windows/289399#289399 等
从我自己的测试中,在C#代码中,通过网络删除文件的最快方法似乎是调用cmd.exe并使用del / f / s / q
var before = DateTime.Now;
var cmd_line = "/c del /f/s/q \"" + Path.Combine(dir, num_to_delete.ToString()) + "\"";
var startInfo = new ProcessStartInfo("cmd", cmd_line)
{
RedirectStandardError = true,
RedirectStandardOutput = true,
UseShellExecute = false
};
var process = new Process() { StartInfo = startInfo };
process.Start();
process.WaitForExit();
var stdOut = process.StandardOutput.ReadToEnd();
var stdErr = process.StandardError.ReadToEnd();
var complete = DateTime.Now;
我的问题是,有没有办法确定del在做什么? Win32中是否存在一个我错过的API,我可以直接调用而不是旋转cmd.exe?
我的代码是在C#中,但如果C#无法提供此方法,我也不介意打电话。
我的测试方法如下:
这让我可以创建大量的文件来挖掘和删除一些。
我尝试的第一个删除方法基本上(这使用了像\ 5 \ 1_0,2_0,2_1这样的结构) - 即同一个文件夹中的所有文件
string strFilePath = Path.Combine(dir, num_to_delete + "-*");
string strDirectory = Path.GetDirectoryName(strFilePath);
string strFileName = Path.GetFileName(strFilePath);
DateTime before, after, complete;
if (strDirectory != null && strFileName != null && Directory.Exists(strDirectory))
{
int number_present = Directory.GetFiles(strDirectory).Length;
before = DateTime.Now;
string[] strFiles = Directory.GetFiles(strDirectory, strFileName);
after = DateTime.Now;
foreach (string strFile in strFiles)
{
File.Delete(strFile);
}
complete = DateTime.Now;
}
第二种删除方法使用结构5 \ 1 \,5 \ 2 \等。 string strDirectory = Path.Combine(dir,num_to_delete.ToString());
DateTime before, after, complete;
int number_present = Directory.GetFiles(dir).Length + Directory.GetDirectories(dir).Length;
before = DateTime.Now;
bool bExists = Directory.Exists(strDirectory);
after = DateTime.Now;
if(bExists)
{
Directory.Delete(strDirectory, true);
}
complete = DateTime.Now;
第三种删除方法使用相同的结构,但保留文件: string strDirectory = Path.Combine(dir,num_to_delete.ToString()); string strFilePath = Path.Combine(strDirectory," *"); string strFileName = Path.GetFileName(strFilePath);
DateTime before, after, complete;
if (Directory.Exists(strDirectory))
{
int number_present = Directory.GetFiles(strDirectory).Length;
before = DateTime.Now;
string[] strFiles = Directory.GetFiles(strDirectory, strFileName);
after = DateTime.Now;
foreach (string strFile in strFiles)
{
File.Delete(strFile);
}
complete = DateTime.Now;
第4个是你在顶部看到的那个。
我的调查结果是,在160个文件大小之后,按速度顺序一次删除5个文件:
我将所有测试运行了3次,并将结果平均为excel,然后对其进行绘制。我想我正确地进行了数值分析。
答案 0 :(得分:3)
您可以使用Rohitab API monitor来了解CMD内部的作用。 CMD是Windows 64位上的64位进程,因此您希望更喜欢64位版本。
对于删除本地文件,CMD使用GetFileType(),GetCurrentDirectory(),GetVolumeInformation(),GetFileAttributes(),GetFullPathName(),FindFirstFileEx(),{ {3}}和DeleteFile()。我通过检查API部分数据访问和存储和设备来捕获这一点。
删除网络共享中的项目时,您可以另外尝试网络/网络共享管理。
我认为.NET在内部使用相同的功能。为什么它还要做任何事情?