簡體   English   中英

刪除目錄中文件的最快方法是什么? (特定文件擴展名除外)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM