簡體   English   中英

C#directory.getfiles內存幫助

[英]C# directory.getfiles memory help

這是我正在使用的代碼:

using (StreamWriter output = new StreamWriter(Path.Combine(masterdestination, "Master.txt")))
{
     string masterfolders = sourcefolder1;
     string[] filess = Directory.GetFiles(masterfolders, "*.txt");
     foreach (string file in filess)
     {
        output.WriteLine(Path.GetFileName(file));
     }
}  

此代碼將搜索用戶指定目錄中任何txt文件的所有文件。 這些目錄有時包含2百萬個文件。

在它運行時監視這個過程我已經看到它爬升到800MB的內存使用量。 有沒有辦法可以保持這個過程的速度並限制它使用的內存? 或者讓它讀取並轉儲並繼續? 哈希表? 任何想法都會很棒。

Directory.GetFiles真的很糟糕。 如果您可以使用.NET 4.0,那么您應該考慮使用Directory.EnumerateFiles 來自文檔:

EnumerateFiles和GetFiles方法的不同之處如下:當您使用EnumerateFiles時,您可以在返回整個集合之前開始枚舉名稱集合; 當您使用GetFiles時,您必須等待返回整個名稱數組,然后才能訪問該數組。 因此,當您使用許多文件和目錄時,EnumerateFiles可以更高效。

如果您正在實施搜索,那么我建議您使用Windows Search 4.0

如果你不能使用Fx4,你最好自己編寫FileEnumerator。 這是一個例子

Directory.GetFiles必須在返回之前構建所有匹配文件的列表。 只有這樣你才能枚舉它們。 當然,當有大量匹配文件時,它很昂貴。 它甚至可以在內部構建所有文件的列表。

如果您可以使用.NET 4.0,那么您可以使用Directory.EnumerateFiles ,它可以通過一次退回一個文件來避免此問題。 如果你不能,那么我建議你用C ++而不是C#來編寫它。

在C ++中,您可以使用FindFirstFile ,它也會在一次返回文件。

// iterate though the files in this directory
//
TCHAR szWild[MAX_PATH];
PathCombine(szWild, masterfolders, _T("*.txt"));

WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile(szWild, &fd);
if (INVALID_HANDLE_VALUE != hFind)
{
   do {
   TCHAR szFileName[MAX_PATH];
   PathCombine(szFileName, masterfolders, fd.cFileName);

   // write szFilename to output stream..

   } while (FindNextFile(hFind, &fd));

   FindClose (hFind);
}

正如在這里的答案中提到的,如果使用.NET 4.0,您可以使用Directory類上的靜態EnumerateFiles方法來獲取IEnumerable<string>而不是string [],這將導致所有內存消耗。

如果您在.NET 4.0之前使用.NET版本,則可以通過P / Invoke層調用FindFirstFileEx,FindNextFile等方法輕松模仿此功能。

然后,對於從對FindFirstFile / FindNextFile的調用返回的每個文件,您將返回該項。

這將減少因為EnumerateFiles對於具有大量文件的目錄的內存消耗,因為您沒有將它們全部加載到陣列中,而是在找到它們時讓它們進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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