我曾经看到过类似的问题:什么是清空目录的最佳方法?
但是我需要知道:
在一个目录中,如何最快地删除所有文件,除了指定后缀名为 .zip
的文件外。
这里似乎有 Linq 的味道... 还是其他方法?
所谓最快的方式,就是指最短的执行时间。
我曾经看到过类似的问题:什么是清空目录的最佳方法?
但是我需要知道:
在一个目录中,如何最快地删除所有文件,除了指定后缀名为 .zip
的文件外。
这里似乎有 Linq 的味道... 还是其他方法?
所谓最快的方式,就是指最短的执行时间。
如果你在使用.NET 4,你可以聪明地利用 .NET 现在可以并行化你的函数。这段代码是最快的方法。它还会随着处理器内核数量的增加而扩展。
DirectoryInfo di = new DirectoryInfo(yourDir);
var files = di.GetFiles();
files.AsParallel().Where(f => f.Extension != ".zip").ForAll((f) => f.Delete());
您是否希望用最少的代码行或最快的执行时间来实现?下面是一个使用LINQ和并行for each循环快速删除的示例。
string[] files = System.IO.Directory.GetFiles("c:\\temp", "*.*", IO.SearchOption.TopDirectoryOnly);
List<string> del = (
from string s in files
where ! (s.EndsWith(".zip"))
select s).ToList();
Parallel.ForEach(del, (string s) => { IO.File.Delete(s); });
在撰写本答案时,先前的答案均未使用Directory.EnumerateFiles(),该方法允许您在构建文件列表时继续对列表执行操作。 代码:
Parallel.ForEach(Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories).AsParallel(), Item =>
{
if(!string.Equals(Path.GetExtension(Item), ".zip",StringComparison.OrdinalIgnoreCase))
File.Delete(Item);
});
这是普通的C#代码
foreach(string file in Directory.GetFiles(Server.MapPath("~/yourdirectory")))
{
if(Path.GetExtension(file) != ".zip")
{
File.Delete(file);
}
}
这里介绍一下LINQ
var files = from f in Directory.GetFiles("")
where Path.GetExtension(f) != ".zip"
select f;
foreach(string file in files)
File.Delete(file);