System.IO网络性能问题

时间:2014-06-16 12:31:00

标签: c# filereader .net

我正在通过网络迭代一个大目录(500 GB),我需要迭代根目录和子目录中的所有文件,这是我的示例代码

    static void WalkDirectoryTree(DirectoryInfo root, DbContext dbcontext)
    {
                FileInfo[] files = null;
                DirectoryInfo[] subDirs = null;

                try
                {
                    Console.WriteLine(DateTime.Now + " Listing files...");
                    files = root.GetFiles("*.*");
                    Console.WriteLine(DateTime.Now + " Files obtained.");
                }
                catch (UnauthorizedAccessException e)
                {

                }

                catch (System.IO.DirectoryNotFoundException e)
                {
                    Debug.Print(e.Message);
                }

                if (files != null)
                {
                    Console.WriteLine(DateTime.Now + " Iterating files...");
                    foreach (System.IO.FileInfo fi in files)
                    {

                        Console.WriteLine(DateTime.Now + " Indexing [" + fi.FullName + "]...");
                        doIndex(IndexData index = new IndexData();

                        index.attachementUID = fi.Name;
                        dbcontext.IndexDatas.Add(index);

                    }
                    Console.WriteLine(DateTime.Now + " File iteration completed.");
                    subDirs = root.GetDirectories();

                    foreach (System.IO.DirectoryInfo dirInfo in subDirs)
                    {
                        WalkDirectoryTree(dirInfo,dbcontext);
                    }
            }
  }

性能非常慢,我正在读取文件名和文件路径,所以你们可以推荐一些东西,我可以用来迭代网络路径中的所有文件,如何改进当前代码,任何System.IO改进和的替代品。

其次,我如何跟踪我在文件系统中的位置。迭代中途和应用程序崩溃,我怎样才能从同一个位置再次开始迭代?

2 个答案:

答案 0 :(得分:5)

您应该使用来自MSDN的DirectoryInfo.EnumerateFiles()而不是DirectoryInfo.GetFiles()

  

EnumerateFiles和GetFiles方法的区别如下:当你   使用EnumerateFiles,您可以开始枚举名称集合   在整个收藏品归还之前;当你使用GetFiles时,你   必须等待返回整个名称数组才能返回   访问数组。因此,当您使用许多文件和   目录,EnumerateFiles可以更有效。

答案 1 :(得分:1)

最后没有解决方案 - 你可以让问题变小,但不会消失。获取大量文件的DirectoryInfo对象(文件大小无关紧要)即使在本地也是一个缓慢的操作,通过网络只需要时间。

10g网络可以提供一些帮助,就像更快的光盘一样,但这不是针对高吞吐量进行优化的操作。