从NetDrives上的大型目录获取文件

时间:2014-07-18 13:02:10

标签: c#

我需要从NetDrive上的目录中获取文件。问题是这个目录可能包含500k文件或更多。

正常方式:

Directory.GetFiles(@"L:\cs\fromSQL\Data", "*.dat",
                                   SearchOption.TopDirectoryOnly);

DirectoryInfo dir = new DirectoryInfo(@"L:\cs\fromSQL\Data");
            var files = 
                dir.GetFiles("*.dat", SearchOption.TopDirectoryOnly)

正在走向漫长。他们总是解析整个目录。

示例:NetDrive-Directory包含~130k文件,第一个选项需要15分钟。

有没有办法获得一些文件(例如最老的文件)或其他更快的文件?

谢谢! 问候 克里斯托弗

2 个答案:

答案 0 :(得分:3)

您可以尝试DirectoryInfo.EnumerateFiles Method

正如msdn所说: -

Returns an enumerable collection of file information in the current directory.

它是IEnumerable,因此它可以传输条目而不是缓冲所有

例如: -

foreach(var file in Directory.EnumerateFiles(path)) {
    // ...
}

有关MSDN的更多详情: -

  

EnumerateFiles和GetFiles方法的区别如下:当你   使用EnumerateFiles,您可以开始枚举集合   返回整个集合之前的FileInfo对象;当你使用   GetFiles,你必须等待整个FileInfo对象数组   在您可以访问该数组之前返回。因此,当你是   使用许多文件和目录,EnumerateFiles可以更多   高效。

答案 1 :(得分:2)

改为使用Directory.EnumerateFiles

var count = Directory.EnumerateFiles(@"L:\cs\fromSQL\Data", "*.dat",
                               SearchOption.TopDirectoryOnly).Count();

如果您要过滤某些文件,请使用DirectoryInfo.EnumerateFiles并使用Where过滤文件:

var di = new DirectoryInfo(@"L:\cs\fromSQL\Data");
var count = di.EnumerateFiles("*.dat",SearchOption.TopDirectoryOnly)
           .Where(file => /* your condition */)
           .Count();