我正在使用目录及其子目录加载树视图。我打电话给:
string[] dirs = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
返回我想要的所有目录和一些我不喜欢的...像无法访问/虚拟'我的音乐'我的视频'等...我当然不能由于库结构(访问被拒绝)......在这些目录中进行任何递归...
如何避免填充这些无法访问的目录?如果操作系统是Vista或7,我可以遍历数组并删除不需要的目录,并留给XP ...但我想知道是否有更多的优雅'解决这个问题?
在Wim的帮助下,我想出了这个: private List<string> MyDocuments()
{
List<string> dirs = new List<string>(Directory.GetDirectories(
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)));
for (int i = 0; i < dirs.Count-1; i++)
{
DirectoryInfo di = new DirectoryInfo(dirs[i]);
if (di.Attributes.HasFlag(FileAttributes.ReparsePoint))
dirs.RemoveAt(i);
}
return dirs;
}
答案 0 :(得分:1)
这些目录似乎都是隐藏的并且具有ReparsePoint
属性(要求它们为空,请阅读this以获取来自msdn和What is the best way to check for reparse point in .net (c#)?的更多信息,以了解它是如何完成的。
我可以理解需要搜索优雅的代码,但问题是,你可以迭代每个目录并检查这个属性,然后跳过将它添加到数组或目录列表中但是imho不如迭代那么优雅dirs数组,捕获异常并删除条目。所以,简而言之,我坚持:
List<string> dirs = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)).ToList();
string[] mySubDirs;
for (int i = 0; i < dirs.Count-1; i++)
{
try
{
mySubDirs = Directory.GetDirectories(dirs[i]);
}
catch (Exception)
{
dirs.RemoveAt(i);
}
}