2013-10-17 46 views
0

我想刪除C#應用程序中臨時文件夾中的所有* .tmp文件。使用cmd.exe執行DEL命令的代碼永遠在使用

使用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"); 
} 

**注:我的錯誤是,我用/ C後DEL和正確的命令行是:

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

雖然,我將切換到基於.NET框架的刪除代碼,如下所述。但是我最初選擇了基於命令行(cmd.exe)的操作,因爲Process.WaitForExit()在執行時沒有掛起程序。我在刪除操作中有1000多個文件要刪除。

+3

你不需要/ c來執行命令嗎? http://ss64.com/nt/cmd.html你甚至使用Run窗口來測試它嗎? –

+0

@ ta-speot-是我用過/ C但是在運行cmd中,它說無效開關。 –

+3

爲什麼不使用'Directory.GetFiles()''foreach他們與'File.Delete()' –

回答

6

你需要一個/ C添加到參數:

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

否則將只運行cmd.exe的,從來沒有退出。

+0

我曾經使用/ C但在運行CMD,它說無效開關。 –

+1

在cmd窗口中嘗試。 「cmd DEL ...」只會啓動一個新的cmd會話。 「cmd/C DEL ...」將運行刪除。 –

+0

謝謝。現在嘗試。 Process.StartInfo.UseShellExecute是否有影響? –

4

不要使用shell(使用Process對象)來處理本機.Net對象可以做的事情。

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

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

參見:

+0

+1更好的解決方案 – gleng

+0

謝謝。現在就試試。 –

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"文件也可以刪除。

+0

謝謝。現在就試試。 –

+0

對-1沒有評論? –

+0

我還沒有投票給任何人。 –