当前位置:  开发笔记 > 编程语言 > 正文

C#中最快的方法是在一个包含20,000多个文件的目录中查找文件

如何解决《C#中最快的方法是在一个包含20,000多个文件的目录中查找文件》经验,为你挑选了2个好方法。

我有一个每晚都要运行的工作,从根目录下有超过20,000个子文件夹的目录中提取xml文件.这是结构的样子:

rootFolder/someFolder/someSubFolder/xml/myFile.xml
rootFolder/someFolder/someSubFolder1/xml/myFile1.xml
rootFolder/someFolder/someSubFolderN/xml/myFile2.xml
rootFolder/someFolder1
rootFolder/someFolderN

所以看看上面的结构,结构总是一样的 - 一个根文件夹,然后是两个子文件夹,然后是一个xml目录,然后是xml文件.我只知道rootFolder和xml目录的名称.

下面的代码遍历所有目录,速度极慢.有关如何优化搜索的任何建议,尤其是目录结构是否已知?

string[] files = Directory.GetFiles(@"\\somenetworkpath\rootFolder", "*.xml", SearchOption.AllDirectories);

Mitchel Sell.. 16

你可以使用GetDirectories,首先得到"第一个子文件夹"的列表,循环遍历这些目录,然后重复子文件夹的循环,循环遍历它们,最后看看,而不是使用GetFiles并进行强力搜索.对于xml文件夹,最后搜索.xml文件.

现在,至于性能,速度会有所不同,但首先搜索目录,然后获取文件应该有很多帮助!

更新

好的,我做了一些测试,你实际上可以比我想象的更进一步优化它.

以下代码段将搜索目录结构并在整个目录树中查找所有"xml"文件夹.

string startPath = @"C:\Testing\Testing\bin\Debug";
string[] oDirectories = Directory.GetDirectories(startPath, "xml", SearchOption.AllDirectories);
Console.WriteLine(oDirectories.Length.ToString());
foreach (string oCurrent in oDirectories)
    Console.WriteLine(oCurrent);
Console.ReadLine();

如果将其放入测试控制台应用程序,您将看到它输出结果.

现在,一旦你有了这个,只需查看每个找到的目录中的.xml文件.



1> Mitchel Sell..:

你可以使用GetDirectories,首先得到"第一个子文件夹"的列表,循环遍历这些目录,然后重复子文件夹的循环,循环遍历它们,最后看看,而不是使用GetFiles并进行强力搜索.对于xml文件夹,最后搜索.xml文件.

现在,至于性能,速度会有所不同,但首先搜索目录,然后获取文件应该有很多帮助!

更新

好的,我做了一些测试,你实际上可以比我想象的更进一步优化它.

以下代码段将搜索目录结构并在整个目录树中查找所有"xml"文件夹.

string startPath = @"C:\Testing\Testing\bin\Debug";
string[] oDirectories = Directory.GetDirectories(startPath, "xml", SearchOption.AllDirectories);
Console.WriteLine(oDirectories.Length.ToString());
foreach (string oCurrent in oDirectories)
    Console.WriteLine(oCurrent);
Console.ReadLine();

如果将其放入测试控制台应用程序,您将看到它输出结果.

现在,一旦你有了这个,只需查看每个找到的目录中的.xml文件.



2> 小智..:

我创建了一个递归方法,GetFolders使用a Parallel.ForEach来查找名为变量的所有文件夹yourKeyword

List returnFolders = new List();
object locker = new object();

Parallel.ForEach(subFolders, subFolder =>
{
    if (subFolder.ToUpper().EndsWith(yourKeyword))
    {
        lock (locker)
        {
            returnFolders.Add(subFolder);
        }
    }
    else
    {
        lock (locker)
        {
            returnFolders.AddRange(GetFolders(Directory.GetDirectories(subFolder)));
        }
    }
});

return returnFolders;

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有