使用通配符删除多个文件


73

您知道在linux中这很容易,但是我不能仅仅理解如何在Windows上的C#中做到这一点。我想删除所有与通配符匹配的文件f*.txt。我该如何去做?

Answers:


137

您可以使用以下DirectoryInfo.EnumerateFiles功能

var dir = new DirectoryInfo(directoryPath);

foreach (var file in dir.EnumerateFiles("f*.txt")) {
    file.Delete();
}

(当然,您可能需要添加错误处理。)


或更短一点:dir.EnumerateFiles("f*.txt").ToList().ForEach(f => f.Delete());
jstuardo

2
@jstuardo:创建列表会失败切换到EnumerateFilesover的意义GetFiles
Ry-

55

我知道这已经得到了回答,并且给出了很好的答案,但是.NET 4.0和更高版本中有替代方法。使用Directory.EnumerateFiles(),因此:

foreach (string f in Directory.EnumerateFiles(myDirectory,"f*.txt"))
{
    File.Delete(f);
}

的缺点DirectoryInfo.GetFiles()是它返回文件列表-99.9%的时间很棒。缺点是,如果该文件夹包含成千上万个文件(这是很少见的),则它会变得非常慢,并且枚举匹配的文件会快得多。


3
注意也DirectoryInfoEnumerateFiles()
TrueWill

6
如果有人想知道为什么这个答案与接受的答案如此相似,那是因为接受的答案已经根据该答案进行了重写。遗憾的DirectoryInfo.GetFiles()是,对于早期版本的.NET,使用(原来的答案)是唯一的方法。
Brian Cryer

1
这个答案Directory.EnumerateFiles()仍然比接受的答案要快,因为它返回的是IEnumerable字符串,而不是FileInfo类,在该类中也需要填充所有其他属性。如果要在删除文件信息之前或之后对文件信息进行其他操作,请使用DirectorInfo,但是如果要删除,请使用Directory。在大目录中,它将更快。
Deano

8

您可以将Directory.GetFiles方法与通配符重载一起使用。这将返回与您的模式匹配的所有文件名。然后,您可以删除这些文件。


3

我知道这个线程现在有点旧了,但是如果您想使用linq,那么

Directory.GetFiles("f:\\TestData", "*.zip", SearchOption.TopDirectoryOnly).ToList().ForEach(File.Delete);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.