c# - 为什么这个 C# 代码这么慢?优化目录/文件搜索和添加所需

标签 c# file directory treeview

我编写了一些相当快速的代码,自从将其更改为“SearchOption.AllDirectories”后,即使只是加载表单/应用程序也需要一分钟。

我可以做些什么来使这个应用程序在加载时运行得更快?任何帮助/信息将不胜感激。

谢谢。

private const string path = @"R:\Folder One\Folder Two\Folder Three";

public frmMain()
{
    InitializeComponent();

    ListDirectory(treeView1, path);
    treeView1.SelectedNode = treeView1.Nodes[0];
    treeView1.SelectedNode.Expand();
}

private void ListDirectory(TreeView treeView, string path)
{
    treeView.Nodes.Clear();
    var rootDirectoryInfo = new DirectoryInfo(path);
    treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
}

private TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
    var directoryNode = new TreeNode(directoryInfo.Name);
    foreach (var directory in directoryInfo.GetDirectories())
    {
        if (!directory.Name.Contains("_") 
             && !directory.Name.Contains("Word Versions") 
             && !directory.Name.Contains("Visio Flowcharts"))
        {
            var dirFileCount = directory.EnumerateFiles(
                         "*.pdf", SearchOption.AllDirectories).Count();
            dirFileCount += directory.EnumerateFiles(
                         "*.xls", SearchOption.AllDirectories).Count();
            dirFileCount += directory.EnumerateFiles(
                         "*.doc", SearchOption.AllDirectories).Count();
            dirFileCount += directory.EnumerateFiles(
                         "*.xlsx", SearchOption.AllDirectories).Count();
            dirFileCount += directory.EnumerateFiles(
                         "*.docx", SearchOption.AllDirectories).Count();
            dirFileCount += directory.EnumerateFiles(
                         "~*", SearchOption.AllDirectories).Count();

            if (dirFileCount != 0)
                directoryNode.Nodes.Add(CreateDirectoryNode(directory));
        }
    }

    foreach (var file in directoryInfo.GetFiles())
    {
        if (file.Extension.Equals(".pdf") 
           || file.Extension.Equals(".xls") 
           || file.Extension.Equals(".doc") 
           || file.Extension.Equals(".xlsx") 
           || file.Extension.Equals(".docx"))
        {
            if (!file.Name.Contains("~") 
                        || !file.Name.Contains("$"))
                directoryNode.Nodes.Add(new TreeNode(file.Name));
        }
    }
    return directoryNode;
}

最佳答案

这个:

var dirFileCount = directory.EnumerateFiles("*.pdf", SearchOption.AllDirectories).Count();
dirFileCount += directory.EnumerateFiles("*.xls", SearchOption.AllDirectories).Count();
dirFileCount += directory.EnumerateFiles("*.doc", SearchOption.AllDirectories).Count();
dirFileCount += directory.EnumerateFiles("*.xlsx", SearchOption.AllDirectories).Count();
dirFileCount += directory.EnumerateFiles("*.docx", SearchOption.AllDirectories).Count();
dirFileCount += directory.EnumerateFiles("~*", SearchOption.AllDirectories).Count();

if (dirFileCount != 0)
    directoryNode.Nodes.Add(CreateDirectoryNode(directory));

完全错误

每个 EnumerateFiles 将重新扫描特定类型文件的所有子目录。更糟糕的是:你正在计算你总共有多少个这种类型的文件,但你想要的是“是否有任何扩展名的文件”?因此,在找到第一个文件 .pdf 后,您可以停止。

您应该搜索“*”,然后按所需的扩展名进行过滤,在找到的第一个文件处停止。

这个

var dirFileCount = from p in directory.EnumerateFiles("*", SearchOption.AllDirectories)
                   let extension = p.Extension
                   where extension.Equals("pdf", StringComparison.OrdinalIgnoreCase) ||
                         extension.Equals("xls", StringComparison.OrdinalIgnoreCase) ||
                         extension.Equals("doc", StringComparison.OrdinalIgnoreCase) ||
                         extension.Equals("xlsx", StringComparison.OrdinalIgnoreCase) ||
                         p.Name.StartsWith("~")
                   select p;

if (dirFileCount.Any())
{
    directoryNode.Nodes.Add(CreateDirectoryNode(directory));
}

可能更好。

您确定必须在子文件夹中搜索吗?因为 SearchOption.AllDirectories 将在子文件夹中搜索,而不仅仅是在给定的文件夹中搜索。

关于c# - 为什么这个 C# 代码这么慢?优化目录/文件搜索和添加所需,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18652966/

相关文章:

c# - 设置延迟更新日期

c# - 实现没有 CA 警告的继承 IDisposable 模式

java - 文件读取失败且没有明确原因 - Java

javascript - 外部文件 - 良好的编程习惯

c - 我无法写入文件

sql-server - 使用 SQL Server 列出父文件夹中的所有文件夹子目录

php将包含文件的文件夹重命名为

c# - 寻找更好的设计 : A readonly in-memory cache mechanism

c# - 有没有办法解决设计时伪错误或让 IDE 忽略它们?

r - 将工作目录设置为R中脚本文件的父文件夹