【发布时间】:2011-01-07 14:11:21
【问题描述】:
我正在编写一个程序,它需要在一个目录及其所有子目录中搜索具有特定扩展名的文件。这将在本地和网络驱动器上使用,因此性能有点问题。
这是我现在使用的递归方法:
private void GetFileList(string fileSearchPattern, string rootFolderPath, List<FileInfo> files)
{
DirectoryInfo di = new DirectoryInfo(rootFolderPath);
FileInfo[] fiArr = di.GetFiles(fileSearchPattern, SearchOption.TopDirectoryOnly);
files.AddRange(fiArr);
DirectoryInfo[] diArr = di.GetDirectories();
foreach (DirectoryInfo info in diArr)
{
GetFileList(fileSearchPattern, info.FullName, files);
}
}
我可以将 SearchOption 设置为 AllDirectories 并且不使用递归方法,但将来我想插入一些代码来通知用户当前正在扫描哪个文件夹。
虽然我现在正在创建一个 FileInfo 对象列表,但我真正关心的是文件的路径。我将有一个现有的文件列表,我想将其与新的文件列表进行比较,以查看添加或删除了哪些文件。有没有更快的方法来生成这个文件路径列表?围绕查询共享网络驱动器上的文件,我可以做些什么来优化此文件搜索?
更新 1
我尝试通过首先查找所有子目录然后迭代扫描每个目录中的文件来创建一个非递归方法来执行相同的操作。方法如下:
public static List<FileInfo> GetFileList(string fileSearchPattern, string rootFolderPath)
{
DirectoryInfo rootDir = new DirectoryInfo(rootFolderPath);
List<DirectoryInfo> dirList = new List<DirectoryInfo>(rootDir.GetDirectories("*", SearchOption.AllDirectories));
dirList.Add(rootDir);
List<FileInfo> fileList = new List<FileInfo>();
foreach (DirectoryInfo dir in dirList)
{
fileList.AddRange(dir.GetFiles(fileSearchPattern, SearchOption.TopDirectoryOnly));
}
return fileList;
}
更新 2
好的,所以我在本地和远程文件夹上运行了一些测试,这两个文件夹都有很多文件(~1200)。这是我运行测试的方法。结果如下。
- GetFileListA():上述更新中的非递归解决方案。我认为这相当于杰的解决方案。
- GetFileListB():原始问题的递归方法
- GetFileListC():使用静态 Directory.GetDirectories() 方法获取所有目录。然后使用静态 Directory.GetFiles() 方法获取所有文件路径。填充并返回一个列表
-
GetFileListD():Marc Gravell 使用队列并返回 IEnumberable 的解决方案。我用生成的 IEnumerable 填充了一个列表
- DirectoryInfo.GetFiles:未创建其他方法。从根文件夹路径实例化一个 DirectoryInfo。使用 SearchOption.AllDirectories 调用 GetFiles
- Directory.GetFiles:未创建其他方法。使用 SearchOption.AllDirectories 调用 Directory 的静态 GetFiles 方法
Method Local Folder Remote Folder GetFileListA() 00:00.0781235 05:22.9000502 GetFileListB() 00:00.0624988 03:43.5425829 GetFileListC() 00:00.0624988 05:19.7282361 GetFileListD() 00:00.0468741 03:38.1208120 DirectoryInfo.GetFiles 00:00.0468741 03:45.4644210 Directory.GetFiles 00:00.0312494 03:48.0737459
。 . .so 看起来 Marc 的速度最快。
【问题讨论】:
-
对我来说看起来不错,我很想知道是否有其他方法。
-
我想知道创建 FileInfo 对象是否实际上会花费任何时间从文件中读取任何内容,或者它是否只是知道它所代表的文件的路径并且仅在我请求时才查询实际文件来自其属性之一的其他信息,例如大小或修改日期。
-
一个快速测试,AllDirectories 更快,但不是很多。 @Eric,我认为它只读取文件元数据,但我可能错了。
-
我认为并行编程将是最好的解决方案。你可以使用 P-LINQ。