从网络驱动器上的大目录中获取文件
本文关键字:获取 文件 网络 驱动器 | 更新日期: 2023-09-27 18:13:42
我需要从网络驱动器上的目录中获取文件。问题是这个目录可能包含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)
的时间太长了。它们总是解析整个Directory。
示例:NetDrive-Directory包含~130k文件,第一个选项耗时15分钟。
是否有一种方法可以获得一些文件(例如最老的文件)或其他更快的东西?
谢谢!问候Christoph
您可以在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可以更多高效。
用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();