c#-4.0 - 扫描目录时出现 UnauthorizedAccessException 'User\Documents\My Music'

标签 c#-4.0 directory

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

我更喜欢教我如何钓鱼的答案,而不是仅仅授之以鱼。就在这一点上,我不确定我需要在哪里具体回答这个问题。我已经阅读了有关 elevating permissions 的文档。和 iterating through the file system ,并花了一周的时间寻找为什么我可以在“用户\我的音乐”上设置 DirectoryInfo,但不能在“用户\文档\我的音乐”(链接)上设置 DirectoryInfo,并且只是希望在了解更多信息方面获得不同方向的一点提升。

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

初始 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。

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

我所做的假设是该文件夹是另一个目录的符号链接(symbolic link),因为我可以将路径设置为 ?:\users directory\user\My (Music, Pictures, or Videos) 并且然后代码就可以毫无问题地遍历这些目录。仅当在用户“我的文档”中设置目录文件后尝试扫描目录文件时,才会发生这种情况。

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

最佳答案

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

该文件夹是一个符号链接(symbolic link),根据 TechRepublic: Answers to some common questions about symbolic links 上的这篇文章,出于向后兼容的目的而放置在那里。 Windows Vista 和 Windows 7 有内置符号链接(symbolic link)第 2 段下。

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

关于c#-4.0 - 扫描目录时出现 UnauthorizedAccessException 'User\Documents\My Music',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10477113/

相关文章:

正则表达式匹配反斜杠星

windows - Windows 中目录/文件夹的 TreeView ?

delphi - 使用 Delphi 通过网络连接到受密码保护的共享文件夹

asp.net - 在 App_Code 目录中调试较长的编译时间

c# - 导出div内容为pdf格式

asp.net-mvc - ASP.NET MVC3,为什么即使在强类型 View 中下拉列表也依赖viewbag

c# - 使用动态类型

windows - Cakephp - 使用 Folder::cd() 更改目录(绝对 Windows 路径)不起作用

xcode - 未正确添加文件夹到Xcode项目

git - 从 GitHub 存储库下载单个文件夹或目录