扫描目录'User\Documents\My Music'时出现UnauthorizedAccessException

Ria*_*ana 6 directory c#-4.0

  1. 问题:为什么在扫描用户的"我的文档"文件夹时出现此错误,但在扫描"我的音乐/我的图片/我的视频"目录时却没有?
  2. 次要的, 不太重要的问题:有没有办法避免这种情况,而无需专门过滤这些文件夹,或使用try/catch块?

我更喜欢那些教我如何钓鱼的答案,而不仅仅是给我鱼.就在这时,我不确定我需要在哪里专门回答这个问题. 我已经阅读了有关提升权限遍历文件系统的文档,并花了一周时间寻找为什么我可以在'User\My Music'上设置DirectoryInfo而不是'User\Documents\My Music'(链接)并且只是在学习更多方面,我会在不同的方向上享受一点点提升.

我捕获了最初在尝试Directory.GetFiles('path',"*",SearchOption.AllDirectories)时抛出的'UnauthorizedAccessException',其中path是用户的"我的文档".为了处理异常,我知道我需要手动遍历目录.哪个有效,从子目录返回文件.

初始GetFiles函数的代码:

public static string[] GetFiles(string path)
{
    string[] files;
    try
    {
        files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);
    }
    catch(UnauthorizedAccessException ex)
    { files = WalkDirectory(path); }
    return files;
}

public static string[] WalkDirectory(string path)
{
    List<string> files = new List<string>();
    DirectoryInfo dir = new DirectoryInfo(path);

    foreach (DirectoryInfo subDir in dir.GetDirectories())
    {
        try
        {
            files.AddRange(WalkDirectory(subDir.FullName));
        }
        catch(UnauthorizedAccessException ex)
        {
            // complete fail to walk directory listed
            throw ex;
        }
    }
    foreach (FileInfo file in dir.GetFiles())
    {
        files.Add(file.FullName);
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,直到代码试图走隐藏文件夹:我的音乐,我的图片或我的视频.无论我如何尝试重新编码以隐藏文件,我都会收到UnauthorizedAccessException.

我完全理解我将围绕这个编码.主要是我很想知道,为什么在用户文件夹下发生异常?

我正在做的一个假设是该文件夹是另一个目录的符号链接,因为我可以创建路径?:\ users目录\ user\My(音乐,图片或视频),然后代码遍历这些目录,没有任何问题.只有在用户My Documents中设置目录文件后尝试扫描目录文件时才会发生这种情况.

  • 操作系统: Windows 7
  • 用户权限:管理员
  • 应用程序提升以管理员身份运行

Ria*_*ana 3

我正在和一位朋友谈论这个问题,他不懂技术,但了解足够的技术来进行对话,他帮助我进一步缩小了这个问题的范围。这实际上是一个重复的问题,并在Check if a file is real or a symbolic link中得到了回答。

该文件夹是一个符号链接,根据TechRepublic上的这篇文章放置在那里是为了向后兼容:在Windows Vista 和 Windows 7 具有内置符号链接第 2 节下回答有关符号链接的一些常见问题。

为了特别避免在 UnauthorizedAccessException 上没有 Try/Catch 块的情况下尝试扫描此目录,需要检查文件夹属性以确定相关文件夹或文件是否是符号链接。上面列出的 stackoverflow 问题再次回答了这个问题。