2013-01-08 32 views
0

我正在加载目录树视图,它的子目录。我呼吁:Windows 7库和目录结构

string[] dirs = Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); 

回报所有我想要的目录和一些我不...喜欢人迹罕至/虚拟“我的音乐”,“我的视频”,等等......当然,我不能做任何由于库结构(拒绝访问)而在这些目录中递归...

如何避免填充这些无法访问的目录?我可以遍历数组,并删除不需要的目录,如果操作系统是Vista或7,并离开XP ...但我想知道是否有一个更优雅的解决方案呢?

与维姆的帮助下,我想出了这个:

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

你是什么意思的“无法访问”? –

+0

返回的结构包含“我的文档\\我的音乐”....这是vista和7虚拟...如果你尝试访问任何在该路径中的任何东西,你会得到访问违规... – devHead

+0

我应该说“路径”返回...不是结构... – devHead

回答

1

这些目录似乎都隐藏的,有ReparsePoint属性(要求他们是空的,从MSDN What is the best way to check for reparse point in .net (c#)?看到更多信息和阅读this它是如何完成的)。

我可以理解需要搜索优雅的代码,但事实是,您可以遍历每个目录并检查此属性,随后将其添加到数组或目录列表中,但不如迭代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); 
    } 
} 
+0

感谢您的阅读!我会在测试一些想法后回来! – devHead

+0

直到我看到更好,您提供的信息引导我到上面发布的内容 – devHead