我正在寻找类似的东西:
Process.Start("cmd.exe", "/C del path\*.(filetypetobedeleted)");
但我想删除除一种文件类型(.txt)之外的所有文件。这包括路径中的文件夹,因此我希望删除路径中的所有内容,但是.txt文件。
答案 0 :(得分:2)
.NET具有用于处理目录和文件的内置类型。使用这些类比仅仅执行del
开始一个单独的过程更容易。
你可以这样写:
var skipExtension=".some";
var directory=new DirectoryInfo(myTargetPath);
var filesToKill=directory.EnumerateFiles()
.Where(fi=>fi.Extension!=skipExtension);
foreach(var file in filesToKill)
{
file.Delete();
}
EnumerateFiles具有允许搜索特定模式和搜索所有子目录的重载,例如:
EnumerateFiles("*.*",SearchOption.AllDirectories)
如果您绝对 使用批处理,请使用PowerShell,而不是cmd。您可以使用PowerShell类直接从C#创建和执行PowerShell管道。
del
是PowerShell中Remove-Item的同义词,其中包含-Exclude
参数。如果要排除特定扩展名,可以写:
Remove-Item c:\scripts\*.* -Exclude *.wav
或
del c:\scripts\*.* -Exclude *.wav
要从C#程序执行此命令,您需要创建PowerShell实例并添加命令和参数:
PowerShell ps = PowerShell.Create();
ps.AddCommand("Remove-Item")
.AddParameter("Path",@"h:\test\*.*")
.AddParameter("Exclude","*.svc");
var results=ps.Invoke();
如果您还要删除文件夹,则需要添加-Recurse
参数
PowerShell ps = PowerShell.Create();
ps.AddCommand("Remove-Item")
.AddParameter("Path",@"h:\test\*")
.AddParameter("Exclude","*.svc")
.AddParameter("Recurse");
var results=ps.Invoke();
答案 1 :(得分:1)
这样的事情可以解决问题:
// Set as read-only
Process.Start("cmd.exe", "/C attrib +r " + path + "\\*." + ext);
// Del will skip read-only
Process.Start("cmd.exe", "/C del " + path + "/q *");
// Rm folders recursively
Process.Start("cmd.exe", "/C for /d %i in (" + path + "\\*) do rd /s /q \"%i\"");
// Remove read-only
Process.Start("cmd.exe", "/C attrib -r " + path + "\\*." + ext);
你可能想给它一点时间来做它的事情。正如@TheLethalCoder所提到的,如果使用单个proc.WaitForExit()
实例,则可以Process
。
修改:这很快变得丑陋。您应该使用.NET。甚至是@PanagiotisKanavos解释的Power-Shell。