我知道那里有重复,但我尝试了大约 10 种方法,它需要 6 毫秒到 29 毫秒之间,每个文件夹平均大约需要 10 毫秒才能从Directory.GetDirectories()
.
我发现的最快的是System.IO.Path.GetFileName(fullPath)
,但仅差一点string.SubString(string.LastIndexOf(@"\")
;
C:\
我正在编写一个更好的 Windows Explorer 版本,但展开并显示所有子文件夹大约需要半秒钟。半秒可能看起来不多,但是 Windows 和我看过的另一个程序会立即出现。
我唯一能想到的就是对文件进行索引并将索引存储为 XML,我想这可以在启动时完成。
我只是好奇 Windows 和另一个控件如何在同一台 PC 上更快地完成它。C# 和托管代码是否比非托管 C++ 慢?
更新:
这是日志条目的示例,我意识到使用 File.AppendAllText 必须打开和关闭文件,但是许多操作只需要 1 毫秒即可完成,因此唯一慢的时间是 SetDirectoryName,它的完成方式如下:
public void LoadChildNodes()
{
// clear the child nodes
this.ChildPanel.Controls.Clear();
// if this path exists
if (Directory.Exists(this.Path))
{
// get the log
WriteLogEntry("After Path Exists: " + stopWatch.Elapsed.Milliseconds.ToString());
// get the directories for this node
string[] tempDirectories = Directory.GetDirectories(this.Path);
// get the log
WriteLogEntry("After GetDirectories: " + stopWatch.Elapsed.Milliseconds.ToString());
// if there rae one or more directories
if ((tempDirectories != null) && (tempDirectories.Length > 0))
{
// reverse the list
List<string> directories = new List<string>();
// iterate the strings
foreach (string tempDirectory in tempDirectories)
{
// add this item
directories.Add(tempDirectory);
}
// now set the directories
directories.Reverse();
// log the time
WriteLogEntry("After Reverse Directories: " + stopWatch.Elapsed.Milliseconds.ToString());
// iterate the directory names
foreach (string directory in directories)
{
// log the time
WriteLogEntry("After Start Iterate New Directory: " + stopWatch.Elapsed.Milliseconds.ToString());
// create the childNode
ExplorerTreeNode childNode = new ExplorerTreeNode();
// the path for folders is the same as the name
string directoryName = System.IO.Path.GetFileName(directory);
// log the time
WriteLogEntry("After set directory name: " + stopWatch.Elapsed.Milliseconds.ToString());
// setup the node
childNode.SetupNode(directoryName, NodeTypeEnum.Folder, this.IconManager, this.Font, path);
// log the time
WriteLogEntry("After Setup Node" + stopWatch.Elapsed.Milliseconds.ToString());
// add this node
this.ChildPanel.Controls.Add(childNode);
// log the time
WriteLogEntry("After Add childNode to Controls: " + stopWatch.Elapsed.Milliseconds.ToString());
// dock to top
childNode.Dock = DockStyle.Top;
// log the time
WriteLogEntry("After Dock: " + stopWatch.Elapsed.Milliseconds.ToString());
}
// finished loading child nodes
stopWatch.Stop();
WriteLogEntry("Finished loading child nodes: " + stopWatch.Elapsed.Milliseconds.ToString());
}
}
}
我试图避免购买控件,以便我可以使项目开源,但我想我只会购买它并且只提供可执行文件。
路径存在后:1 GetDirectories 后:2 反向目录后:3 开始迭代新目录后:3 设置目录名称后:20 设置节点后 21 将子节点添加到控件后:21 停靠后:22 开始迭代新目录后:22 设置后目录名称:29 设置节点后 29 将子节点添加到控件后:30 停靠后:30 开始迭代新目录后:30 设置目录名称后:37 设置节点后 38 将子节点添加到控件后:38 停靠后:39 开始迭代新目录后: 39