![](/img/trans.png)
[英]What is the best way of searching a files with specific extension in another group of files
[英]What is the fastest way of deleting files in a directory? (Except specific file extension)
我看到過諸如清空目錄的最佳方法是什么之類的問題?
但我需要知道,
刪除目錄中找到的所有文件的最快方法是什么,找到的任何.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 的示例,每個循環都有一個並行以快速刪除它們。
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);
});
據我所知,在這種情況下,使用 AsParallel() 的性能提升不應該是顯着的(如果找到),但是在我的情況下確實有所不同。
我比較了刪除 4689 個文件列表中除 .zip 文件之外的所有文件所需的時間,其中 10 個是使用 1-foreach 的 zip 文件。 2 並行 foreach。 3-IEnumerable().AsParallel().ForAll。 使用 IEnumerable().AsParallel() 的 4 並行 foreach,如上所示。 結果:
1-1545
2-1015
3-1103
4-839
第五個也是最后一個案例是使用 Directory.GetFiles() 的普通 foreach
5-2266
當然,結果並不是決定性的,據我所知,要進行適當的基准測試,您需要使用 ram 驅動器而不是 HDD。
注意:隨着文件數量的增加,EnumerateFiles 和 GetFiles 之間的性能差異變得更加明顯。
這是普通的舊 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.