2

我想在我的 C# 应用程序的临时文件夹中删除所有 *.tmp 文件。

使用 cmd.exe 执行 DEL 命令的代码需要很长时间。它Process.WaitForExit()永远存在并且Process.HasExited仍然是虚假的。但是,如果在 cmd 中手动使用,相同的命令运行良好:

DEL /Q /F "C:\Users\WinUser\AppData\Local\Temp\abc\*.tmp"

代码:

Process Process = new Process();

Process.StartInfo.FileName = "cmd.exe";
Process.StartInfo.Arguments = " DEL /Q /C /F \"C:\\Users\\WinUser\\AppData\\Local\\Temp\\abc\\*.tmp\"";
Process.StartInfo.CreateNoWindow = true;
Process.StartInfo.UseShellExecute = false;
Process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

Process.Start();

Process.WaitForExit();

while (!Process.HasExited)
{
    MessageBox.Show("Error");
}

**注意:我的错误是我在 DEL 之后使用 /C 并且正确的命令行是:

Process.StartInfo.Arguments = " cmd /C DEL /Q /F \"C:\\Users\\WinUser\\AppData\\Local\\Temp\\abc\\*.tmp\"";

不过,我将切换到下面提到的基于 .NET 框架的删除代码。但是我最初选择了基于命令行(cmd.exe)的操作,因为Process.WaitForExit()执行时不会挂起程序。我在删除操作中有 1000 多个文件要删除。

4

3 回答 3

8

您需要在参数中添加 /C:

Process.StartInfo.Arguments = "/C DEL /Q /F \"C:\\Users\\WinUser\\AppData\\Local\\Temp\\abc\\*.tmp\"";

否则它只会运行 cmd.exe 并且永远不会退出。

于 2013-10-17T12:03:39.833 回答
4

不要使用 shell out(使用Process对象)来执行您可以使用本机 .Net 对象执行的操作。

DirectoryInfo tempDir = new DirectoryInfo("C:\\Users\\WinUser\\AppData\\Local\\Temp\\abc\\");

foreach (FileInfo tempFile in tempDir.GetFiles())
{
    tempFile.Delete();
}

看:

于 2013-10-17T12:08:12.953 回答
1

我宁愿这样做:

string[] files = Directory.GetFiles("C:\\Users\\WinUser\\AppData\\Local\\Temp\\abc", "*.tmp");

foreach (string filename in files)
    File.Delete(filename);

因为 .Net 具有相同的功能

也可以删除SearchOption.AllDirectories所有子目录文件。"*.tmp"

于 2013-10-17T12:11:43.990 回答