【问题标题】:Unauthorized Access Exception DirectoryInfo.GetFiles() method未经授权的访问异常 DirectoryInfo.GetFiles() 方法
【发布时间】:2021-07-02 19:02:45
【问题描述】:

我写了一个程序(在 Windows 7 上)调用方法 DirectoryInfo.GetFiles(),在文件夹“文档和设置”中,我有 UnauthorizedAccess 的例外。

我尝试了很多解决方案,例如:

创建清单


    `<requestedExecutionLevel level="highestAvailable" uiAccess="false" />`

and also with this

    DirectorySecurity dSecurity = Directory.GetAccessControl(dir.FullName);
    dSecurity.AddAccessRule(new FileSystemAccessRule("Luca", FileSystemRights.FullControl, AccessControlType.Allow));
    
    Directory.SetAccessControl(dir.FullName, dSecurity);

可能是什么问题?

【问题讨论】:

  • 右键单击并以管理员身份运行您的应用程序
  • 根据this没有FileInfo.GetFiles()方法。
  • 哈哈...很确定他的意思是DirectoryInfo.GetFiles()。 @user2424742,您是否使用递归 AllDirectories 选项?
  • @Idle_Mind 我不知道你在说什么,对不起!所以,我想我没有使用那个选项。我也尝试右键单击并以管理员身份运行,但它不起作用。有没有人能够制作一个程序,无一例外地创建一个树视图,它可以浏览我的电脑中的所有文件夹和文件,有 WINDOWS SEVEN? :) 谢谢!
  • 如果您在尝试列出文件时遇到未经授权的访问异常,您将无法获得完整列表。充其量您将能够获得您有权访问的文件夹/文件。

标签: c# unauthorizedaccessexcepti


【解决方案1】:

首先,您应该使用 DirectoryInfo.EnumerateFiles(...) 而不是 GetFiles(...)。 EnumerateFiles(...) 让您不必获取整个列表,直到您真正需要为止。

我不久前遇到了这个问题,发现我最终需要实现一个替换 IEnumerable 才能完成对我可能只选择访问的文件夹的枚举。

你可以在下面的帖子中看到我的研究结果。 DirectoryInfo.EnumerateFiles(...) causes UnauthorizedAccessException (and other exceptions)

【讨论】:

    【解决方案2】:

    只是快速复制粘贴,因为我遇到了同样的问题。 根据您的需要调整代码(因为我计算大小,计算所有文件并将我要复制的所有文件“保存”在列表中)。 在您获得列表中的所有文件后,您可以开始复制它们或您想对文件做什么:

    private double CalculateSize(string sourcePath, Progress state, List<FileInfo> filesToCopy)
        {
            int _fileCount = 0;
            DirectoryInfo sourceDirectory = new DirectoryInfo(sourcePath);
    
            FileInfo[] files = null;
            try
            {
                files = sourceDirectory.GetFiles();
            }
            catch(UnauthorizedAccessException ex)
            { 
                // DO SOME LOGGING-MAGIC IN HERE...
            }
    
            if (files != null)
            {
                foreach (FileInfo file in files)
                {
                    fullSizeToCopy += file.Length;
                    filesToCopy.Add(file);
                    _fileCount++;
                }
            }
    
            DirectoryInfo[] directories = null;
            try
            {
                directories = sourceDirectory.GetDirectories();
            }
            catch(UnauthorizedAccessException ex)
            {
                // Do more logging Magic in here...
            }
            if (directories != null)
            foreach (DirectoryInfo direcotry in directories)
            {
                CalculateSize(direcotry.FullName, state, filesToCopy);
            }
            state.FileCount = _fileCount;
    
            return fullSizeToCopy;
        }
    

    【讨论】:

      【解决方案3】:

      您最好的选择可能是在调用周围放置一个 try/catch 块并忽略您无权访问的任何目录。也许不是最好的解决方案,但它至少会让你的方法获得你可以访问的所有目录。像这样的:

      try
      {
          directory.GetFiles();
      }
      catch (UnauthorizedAccessException)
      {
          string logMsg = string.Format("Unable to access directory {0}", directory.FullName);
          //Handle any desired logging here
      }
      

      【讨论】:

      • 从长远来看,这最终无法正常工作。它将无法返回您有权访问的文件夹/文件的完整枚举。结果列表将仅包含在遇到异常之前检查的文件/文件夹。
      【解决方案4】:

      就像打击一样,使用 EnumerateDirectories 而不是 DirectoryInfo.getfiles

      private void ScanEmptyDirs(string dir, ref int cnt, CancellationToken token)
          {
              if (String.IsNullOrEmpty(dir))
              {
                  throw new ArgumentException("Starting directory is a null reference or an empty string: dir");
              }
              try
              {
                  foreach (var d in Directory.EnumerateDirectories(dir))
                  {                  
                      if (token.IsCancellationRequested)
                      {
                          token.ThrowIfCancellationRequested();
                      }
                      ScanEmptyDirs(d, ref cnt, token);
                  }
                  EmptyJudge(dir, ref cnt);
              }
              catch (UnauthorizedAccessException) { }
          }
      

      【讨论】:

        猜你喜欢
        • 2014-07-01
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多