从网络驱动器上的大目录中获取文件

本文关键字:获取 文件 网络 驱动器 | 更新日期: 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();