0

我正在加载一个带有目录的树视图,它是子目录。我的呼吁:

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;
    }
4

1 回答 1

1

这些目录似乎既隐藏又具有ReparsePoint属性(要求它们为空,从 msdn 和What is the best way to check for reparse point in .net (c#)?了解更多信息,了解是如何完成的)。

我可以理解搜索优雅代码的需要,但问题是,您可以遍历每个目录并检查此属性,随后跳过将其添加到数组或目录列表中,但恕我直言,这不如迭代 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);
    }
}
于 2013-01-08T20:46:26.810 回答