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

时间:2012-05-07 05:31:23

标签: c#-4.0 directory

  1. 问题:为什么我在扫描用户的“我的文档”文件夹时出现此错误,但在扫描“我的音乐/我的图片/我的视频”目录时却没有?
  2. 次要, 不太重要的问题 :有没有办法避免这种情况,而无需专门过滤这些文件夹,或者尝试使用/ catch block?
  3. 我更喜欢那些教我如何钓鱼的答案,而不仅仅是给我鱼。就在这一点上,我不确定我需要在哪里专门回答这个问题。我已阅读有关elevating permissionsiterating through the file system的文档,并花了一周的时间寻找原因我可以在“用户\我的音乐”上设置DirectoryInfo,但不能在“用户\文档\我的音乐”(链接)上设置目录信息,只是在学习更多的方面享受不同方向的一点推动。

    我捕获了最初在尝试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);
        }
    }
    

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

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

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

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

1 个答案:

答案 0 :(得分:3)

我和一位朋友谈论这件事,他不是技术人员,但知道足够的技术来进行对话,他帮助我进一步缩小这个问题。这实际上是一个重复的问题,已在Check if a file is real or a symbolic link处回答。

该文件夹是一个符号链接,根据 Windows TechRepublic:Answers to some common questions about symbolic links 下的文章放置在那里以便向后兼容Vista和Windows 7具有内置的符号链接第2段。

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