我需要从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分钟。
有没有办法获得一些文件(例如最老的文件)或其他更快的文件?
谢谢! 问候 克里斯托弗
答案 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();