そこに重複があることは知っていますが、約 10 の方法を試しましたが、各フォルダーで返されたパスからファイルの名前を解析するのに平均で約 10 ミリ秒かかり、6 ミリ秒から 29 ミリ秒かかりましたDirectory.GetDirectories()
。
私が見つけた最速は ですがSystem.IO.Path.GetFileName(fullPath)
、わずかな差でstring.SubString(string.LastIndexOf(@"\")
;
C:\
私はより良いバージョンの Windows エクスプローラーを作成していますが、展開してすべてのサブ フォルダーを表示するのに約 0.5 秒かかります。0.5 秒は大したことではないように思えるかもしれませんが、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 開始後 Iterate New Directory: 3 ディレクトリ名を設定した後: 20 Setup Node21 の後 childNode を Controls に追加した後: 21 Dock の後: 22 Start の後 Iterate New Directory: 22 設定した後ディレクトリ名: 29 セットアップ後 Node29 後 ChildNode をコントロールに追加: 30 Dock 後: 30 開始後 Iterate 新しいディレクトリ: 30 セット ディレクトリ名の後: 37 セットアップ後 Node38 後 ChildNode をコントロールに追加: 38 Dock 後: 39 Start 後 Iterate New Directory :39