我已經見過像What is the best way to empty a directory?什麼是刪除目錄中文件的最快方式? (除特定的文件擴展名)
問題,但我需要知道,
什麼是刪除所有目錄中找到的文件,除非發現有任何.zip
文件的最快方式。
聞起來像linq這裏......或什麼?
通過說最快的方式,我的意思是最快的執行時間。
我已經見過像What is the best way to empty a directory?什麼是刪除目錄中文件的最快方式? (除特定的文件擴展名)
問題,但我需要知道,
什麼是刪除所有目錄中找到的文件,除非發現有任何.zip
文件的最快方式。
聞起來像linq這裏......或什麼?
通過說最快的方式,我的意思是最快的執行時間。
這裏是普通的老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);
通過最快你要求最少的代碼行或最快的執行時間?下面是一個使用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); });
如果您使用的是.NET 4,那麼您可以通過智能化的方式來讓.NET變得更加平滑您的功能。這段代碼是禁食的方式。這也會隨着處理器上的核心數量而變化。
DirectoryInfo di = new DirectoryInfo(yourDir);
var files = di.GetFiles();
files.AsParallel().Where(f => f.Extension != ".zip").ForAll((f) => f.Delete());
在寫這個答案沒有()使用Directory.EnumerateFiles以前的答案,讓您在正在建造的名單上的文件列表上的操作進行的時間。 代碼:
Parallel.ForEach(Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories).AsParallel(), Item =>
{
if(!string.Equals(Path.GetExtension(Item), ".zip",StringComparison.OrdinalIgnoreCase))
File.Delete(Item);
});
據我所知使用進行AsParallel性能增益()不應該顯著(如果找到)在這種情況下,但它確實使我的情況不同。
我比較了使用1-foreach刪除包含10個zip文件的4689個文件列表中除.zip文件外的所有時間。 2平行的foreach。 3- IEnumerable的()。進行AsParallel()。的ForAll。 4-foreach使用IEnumerable()。AsParallel(),如上所示。 結果:
1-1545
2-1015
3-1103
4-839
第五和最後一種情況下是使用一個Directory.GetFiles正常的foreach( )
5-2266
當然結果並不確定,據我所知,進行適當的基準測試時,您需要使用RAM而不是HDD。
注意:隨着文件數量的增加,EnumerateFiles和GetFiles之間的性能差異變得更加明顯。
你在做什麼語言/操作系統? – Eli 2011-02-12 23:48:41
我認爲C#/ LINQ標籤已經足夠了@Eli – Marko 2011-02-12 23:52:42
LINQ不會比任何其他方法都快;它仍然需要枚舉文件。瓶頸是您的磁盤,而不是負責發送請求的代碼。 – 2011-02-13 08:25:10