C# 为什么这个c代码这么慢?需要对目录/文件搜索和添加进行优化
我已经编写了一些相当快速的ish代码,自从将其更改为SearchOption.allDirectory之后,甚至只需加载表单/应用程序都需要一整分钟的时间 我能做些什么使这个应用程序在加载时运行得更快吗?如有任何帮助/信息,将不胜感激 谢谢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
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秒,我很高兴。再次感谢,我感谢你的时间和帮助。我唯一想在你的代码中修改的就是包含。在扩展搜索字符串中。