使用通配符删除多个文件

pro*_*ngs 66 c# windows

你知道在linux中这很简单但我不能只在Windows上用C#来理解它.我想删除所有匹配通配符的文件f*.txt.我该怎么做呢?

Ry-*_*Ry- 129

你可以使用这个DirectoryInfo.EnumerateFiles功能:

var dir = new DirectoryInfo(directoryPath);

foreach (var file in dir.EnumerateFiles("f*.txt")) {
    file.Delete();
}
Run Code Online (Sandbox Code Playgroud)

(当然,您可能希望添加错误处理.)

  • @jstuardo:创建一个列表会破坏通过“GetFiles”切换到“EnumerateFiles”的意义。 (3认同)
  • 或者更短: `dir.EnumerateFiles("f*.txt").ToList().ForEach(f => f.Delete());` (2认同)

Bri*_*yer 49

我知道这已经得到了回答并得到了一个很好的答案,但在.NET 4.0及更高版本中还有另一种选择.使用Directory.EnumerateFiles(),因此:

foreach (string f in Directory.EnumerateFiles(myDirectory,"f*.txt"))
{
    File.Delete(f);
}
Run Code Online (Sandbox Code Playgroud)

缺点DirectoryInfo.GetFiles()是它返回一个文件列表 - 其中99.9%的时间是很好的.缺点是如果文件夹包含数万个文件(这是罕见的),那么它变得非常慢,并且通过匹配文件进行枚举要快得多.

  • 如果有人想知道为什么这个答案与接受的答案非常相似,那是因为接受的答案已经根据这个答案重写了.这是一种耻辱,因为使用`DirectoryInfo.GetFiles()`(这是原始答案)是对早期版本的.NET执行此操作的唯一方法. (5认同)
  • 请注意,`DirectoryInfo`也有`EnumerateFiles()`. (3认同)
  • 这个答案,Directory.EnumerateFiles(),仍然比当时接受的答案更快,因为它返回一个 IEnumerable 字符串,而不是 FileInfo 类,其中所有其他属性也需要填充。如果要在删除之前或之后对文件信息执行其他操作,请使用DirectorInfo,但如果您只是删除,请使用Directory。在大目录中,速度会快得多。 (2认同)

key*_*rdP 8

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


s1c*_*t3r 5

我很欣赏这个线程现在有点旧了,但是如果你想使用 linq 那么

Directory.GetFiles("f:\\TestData", "*.zip", SearchOption.TopDirectoryOnly).ToList().ForEach(File.Delete);
Run Code Online (Sandbox Code Playgroud)