cmd.exe中del或擦除的内容是什么?

时间:2016-05-24 20:35:38

标签: c# windows cmd

我已经在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,10,20,最多10240)
  • 5以下,创建一个文件夹1,将1 100 KB文件放入其中
  • 5以下,创建一个文件夹2,在其中放入2个100 KB文件 等等,直到叶子下面共有5个文件。
  • 然后重复整个过程10,依此类推

这让我可以创建大量的文件来挖掘和删除一些。

我尝试的第一个删除方法基本上(这使用了像\ 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个文件:

  • 4th(del / f / s / q)
  • 1st(从一个大文件夹中删除文件)
  • 2nd(从子文件夹中删除文件,但保留文件夹)
  • 3rd(从子文件夹中删除文件并保留子文件夹)

我将所有测试运行了3次,并将结果平均为excel,然后对其进行绘制。我想我正确地进行了数值分析。

1 个答案:

答案 0 :(得分:3)

您可以使用Rohitab API monitor来了解CMD内部的作用。 CMD是Windows 64位上的64位进程,因此您希望更喜欢64位版本。

对于删除本地文件,CMD使用GetFileType()GetCurrentDirectory()GetVolumeInformation()GetFileAttributes()GetFullPathName()FindFirstFileEx(),{ {3}}和DeleteFile()。我通过检查API部分数据访问和存储设备来捕获这一点。

删除网络共享中的项目时,您可以另外尝试网络/网络共享管理

我认为.NET在内部使用相同的功能。为什么它还要做任何事情?