Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个c代码这么慢?需要对目录/文件搜索和添加进行优化_C#_File_Directory_Treeview - Fatal编程技术网

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

C# 为什么这个c代码这么慢?需要对目录/文件搜索和添加进行优化,c#,file,directory,treeview,C#,File,Directory,Treeview,我已经编写了一些相当快速的ish代码,自从将其更改为SearchOption.allDirectory之后,甚至只需加载表单/应用程序都需要一整分钟的时间 我能做些什么使这个应用程序在加载时运行得更快吗?如有任何帮助/信息,将不胜感激 谢谢 private const string path = @"R:\Folder One\Folder Two\Folder Three"; public frmMain() { InitializeComponent(); ListDir

我已经编写了一些相当快速的ish代码,自从将其更改为SearchOption.allDirectory之后,甚至只需加载表单/应用程序都需要一整分钟的时间

我能做些什么使这个应用程序在加载时运行得更快吗?如有任何帮助/信息,将不胜感激

谢谢

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;
}

为什么不在FormLoad上加载根目录,然后在用户展开每个子节点后加载该节点呢

除此之外,为什么不看看如何使用使用户界面更具交互性呢

BackgroundWorker类允许您在服务器上运行操作 独立的、专用的线程。像下载这样耗时的操作 和数据库事务可能会导致用户界面UI 就好像它在运行时停止了响应。当你 想要一个响应迅速的用户界面,您将面临与之相关的长时间延迟 通过这些操作,BackgroundWorker类提供了一个方便的 解决方案


为什么不在FormLoad上加载根目录,然后在用户展开每个子节点后加载该节点呢

除此之外,为什么不看看如何使用使用户界面更具交互性呢

BackgroundWorker类允许您在服务器上运行操作 独立的、专用的线程。像下载这样耗时的操作 和数据库事务可能会导致用户界面UI 就好像它在运行时停止了响应。当你 想要一个响应迅速的用户界面,您将面临与之相关的长时间延迟 通过这些操作,BackgroundWorker类提供了一个方便的 解决方案


在单独的线程中运行代码

Thread yourThread = new System.Threading.Thread(delegate(){
          //Your code 
 });
yourThread.Start();
更新主线程控件时要小心,您需要使用Invoke,例如在WPF应用程序中

Dispatcher.Invoke(new Action(delegate()
                 // your code that update main thread controls
                {}));

在单独的线程中运行代码

Thread yourThread = new System.Threading.Thread(delegate(){
          //Your code 
 });
yourThread.Start();
更新主线程控件时要小心,您需要使用Invoke,例如在WPF应用程序中

Dispatcher.Invoke(new Action(delegate()
                 // your code that update main thread controls
                {}));
这:

完全是w r o n g

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

您应该搜索*并按所需扩展名进行筛选,在找到的第一个文件处停止

这个

可能更好

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

这:

完全是w r o n g

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

您应该搜索*并按所需扩展名进行筛选,在找到的第一个文件处停止

这个

可能更好


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

int doc\u filescont=directory\u info.GetFileSystemInfos*.doc.Length


它将在一个目录中生成.doc和.docx文件计数

int doc\u filescont=directory\u info.GetFileSystemInfos*.doc.Length


它将在一个目录中同时生成.doc和.docx文件计数

不要多次枚举同一目录。EnumerateFiles.Yes,我确实这么想,但不知道如何在EnumerateFiles参数中添加1个以上的搜索字符串。枚举所有文件**一次并获取扩展名。您正在主ui线程上加载构造函数树视图中的所有文件/文件夹。相反,从OnLoad调用listDirectory函数,如果您熟悉异步编程,那么在线程上列出文件夹的内容,只需将要添加节点的部分发送到主线程。还有一件事,用户展开或单击每个子节点后,您可以加载该节点。不要多次枚举同一目录。directory.EnumerateFiles.Yes,我确实这么想,但不知道如何在EnumerateFiles参数中添加1个以上的搜索字符串。枚举所有文件**一次并获取扩展名。您正在主ui线程上加载构造函数树视图中的所有文件/文件夹。相反,从OnLoad调用listDirectory函数,如果您熟悉异步编程,那么在线程上列出文件夹的内容,只需将要添加节点的部分发送到主线程。用户展开或单击每个子节点后,您还可以加载该节点。这应该是第一步。如果你仍然有性能问题,你可以考虑把工作推到一个线程上。非常感谢。我意识到我现在是多么愚蠢。加载时间已缩短到t
o不到10秒,我很满意。再次感谢,我感谢你的时间和帮助。我唯一想在你的代码中修改的就是包含。在扩展搜索字符串中。这应该是第一步。如果你仍然有性能问题,你可以考虑把工作推到一个线程上。非常感谢。我意识到我现在是多么愚蠢。加载时间已下降到不到10秒,我很高兴。再次感谢,我感谢你的时间和帮助。我唯一想在你的代码中修改的就是包含。在扩展搜索字符串中。