【问题标题】:Windows 7 Libraries and Directory structureWindows 7 库和目录结构
【发布时间】:2013-01-08 19:19:34
【问题描述】:

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

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

【问题讨论】:

  • “无法访问”是什么意思?
  • 返回的结构包含“我的文档\\我的音乐” ....这在 vista 和 7 上很重要...如果您尝试访问该路径中的任何内容,您会遇到访问冲突...
  • 我应该说“路径”返回...不是结构...
  • 这很可能是权利问题。确保您以管理员身份运行 Visual Studio,然后再次运行/调试。 SpecialFolders 不应该再给您带来困难了。
  • No Wim...这不是访问权限...如果您正在运行的 windows vista 或 7 使用上面的代码并看到它返回“我的音乐”,它不在“我的文档”中Vista和7...与Library结构有关...

标签: c# winforms windows-7 directory-structure .net


【解决方案1】:

这些目录似乎都是隐藏的,并且具有ReparsePoint 属性(要求它们为空,请阅读this 以获取来自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);
    }
}

【讨论】:

  • 感谢您的阅读!我测试了一些想法后会回来!
  • 直到我看得更清楚,您提供的信息将我引向我在上面发布的内容
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2012-11-04
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多