カスタム ファイル ダイアログを作成していますが、ロードに時間がかかりすぎるという問題があります。
ダイアログはプロパティで始まります。最初にディレクトリ ツリーをロードし、続いてバックグラウンド スレッドで残りのInitialDirectory
ディレクトリをロードする方法を探しています。InitialDirectory
たとえば、InitialDirectory
がだった場合、C:\Users\User12345\MyDocuments
すべてのフォルダーをロードする必要があります
C:\ C:\ユーザー C:\User12345 C:\Users\User12345\MyDocuments
次に、バックグラウンド スレッドを開始して、残りのすべてのディレクトリをロードします。
再帰を使用してInitialDirectory
、アイテムを複製することなく、他の何よりも最初に をロードするための迅速かつ簡単な方法はありますか?
次のようなコードでフォルダーの存在を確認するとif (!Directory.Contains(f => f.FullName == folder.FullName))
、負荷がかなり遅くなるため、これを行うための高性能な方法を見つけるのに苦労しています。
ディレクトリ全体をロードする現在のコードは次のようになります。
private void LoadDirectory()
{
string root = @"C:\";
var rootNode = new DirectoryModel() { Name = root, FullName = root };
this.Directory.Add(rootNode);
DirectoryInfo info = new DirectoryInfo(root);
IEnumerable<DirectoryInfo> subDirectories = info.GetDirectories()
.Where(d => ((d.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
&& ((d.Attributes & FileAttributes.System) != FileAttributes.System));
LoadDirectories(subDirectories, root);
}
private void LoadDirectories(IEnumerable<DirectoryInfo> subDirs, string parentName)
{
IEnumerable<DirectoryInfo> subdirectories;
foreach (DirectoryInfo folder in subDirs)
{
var node = new DirectoryModel() { Name = folder.Name, FullName = folder.FullName, ParentName = parentName };
Directory.Add(node);
try
{
subdirectories = folder.GetDirectories("*", SearchOption.TopDirectoryOnly)
.Where(d => ((d.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
&& ((d.Attributes & FileAttributes.System) != FileAttributes.System));
}
catch (UnauthorizedAccessException e)
{
continue;
}
catch (System.IO.DirectoryNotFoundException e)
{
continue;
}
if (subdirectories.Count() != 0)
LoadDirectories(subdirectories, folder.FullName);
}
}
Directory
コレクションはフラット コレクションであることに注意してください。データ モデルに階層はありません。