我有一個文件夾太多的文件,我想逐個瀏覽每個文件。問題是Directory.GetFiles返回一個完整的數組,這需要很長時間。讓Directory.GetFiles一次返回一個文件? (.NET)
我寧願有一個對象,我會指向一個文件夾,然後調用一個函數,該函數返回文件夾中的下一個文件。 .NET有這樣的課程嗎?
(我寧願避免win32的互操作性展示,因爲我打算用這條單爲好。)
非常感謝。
我有一個文件夾太多的文件,我想逐個瀏覽每個文件。問題是Directory.GetFiles返回一個完整的數組,這需要很長時間。讓Directory.GetFiles一次返回一個文件? (.NET)
我寧願有一個對象,我會指向一個文件夾,然後調用一個函數,該函數返回文件夾中的下一個文件。 .NET有這樣的課程嗎?
(我寧願避免win32的互操作性展示,因爲我打算用這條單爲好。)
非常感謝。
你不能這樣做在.net 3.5,但你可以在.NET 4.0中,as per this blog post:
DirectoryInfo directory = new DirectoryInfo(@"\\share\symbols");
IEnumerable<FileInfo> files = directory.EnumerateFiles();
foreach (var file in files) {
Console.WriteLine("Name={0}, Length={1}", file.Name, file.Length);
}
(同樣有一個靜態Directory.EnumerateFiles
方法)
我不知道無論該API是否已被移植到Mono。
看看CodeProject網站上的FastDirectoryEnumerator項目。
它正是你所需要的,甚至更多,我能夠成功地使用它在一個緩慢的網絡共享與大量的文件和性能非常好。
缺點 - 它使用interop,所以它可能不能移動到Mono。
謝謝,我最終可能會使用它,但如果它引發互操作異常,則會回退到Directory.GetFiles,表明我可能不在win32上。 – billpg 2010-02-26 11:56:36
您可以使用'Environment.OSVersion'來確定您是否在Windows下運行,並找到一些其他代碼可以在您定位的操作系統上快速運行。 – 2010-02-28 14:06:18
只是一個問題,爲什麼不使用:var files = directory.EnumerateFiles(); ? – 2010-02-19 10:21:14
@Filip:我不知道Jon的原因,但爲了清晰起見,我會使用類型名稱,因爲從方法名稱中可以看出它返回的是什麼類型。 – 2010-02-19 10:24:13
@Fredrik,是不是很清楚它將返回一個可枚舉的文件信息列表?方法名稱真的是自我解釋。對於DirectoryInfo也是如此,我寧願使用var directory = ...我知道編譯時有差別。 – 2010-02-19 10:27:43