我正在编写一个程序,需要搜索一个目录及其所有子目录中具有特定扩展名的文件。这将在本地和网络驱动器上使用,因此性能是有点问题的。
这是我现在正在使用的递归方法:
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():上面更新中的非递归解决方案。我认为它等同于Jay的解决方案。
- GetFileListB():原问题中的递归方法。
- GetFileListC():使用静态
Directory.GetDirectories()
方法获取所有目录。然后使用静态Directory.GetFiles()
方法获取所有文件路径。填充并返回一个列表。 - GetFileListD():Marc Gravell的解决方案,使用队列并返回
IEnumerable
。我使用生成的IEnumerable
填充了一个列表。- DirectoryInfo.GetFiles:未创建任何其他方法。从根文件夹路径实例化了一个DirectoryInfo。使用
SearchOption.AllDirectories
调用了GetFiles
- DirectoryInfo.GetFiles:未创建任何其他方法。从根文件夹路径实例化了一个DirectoryInfo。使用
- 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
看起来Marc的是最快的。