我正在构建一个自定义文件对话框,我的问题是加载时间太长。
对话框以一个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
集合是一个平面集合 - 数据模型中没有层次结构。