【问题标题】:UnauthorizedAccessException trying to delete a file in a folder where I can delete others files with the same codeUnauthorizedAccessException 试图删除文件夹中的文件,我可以使用相同的代码删除其他文件
【发布时间】:2010-11-12 12:52:42
【问题描述】:

我遇到了未经授权的访问异常

  • 在我可以手动删除的文件中。
  • 在我可以通过代码删除其他文件的文件夹中
  • 并且文件未标记为只读
  • 此外,我在独立 PC 中使用 Windows XP,并且我没有为文件夹或文件分配任何权限。
  • 没有其他进程正在使用该文件

如果有帮助,这是发生异常的代码:

protected void DeleteImage(string imageName)
{
    if (imageName != null)
    {
        string f = String.Format("~/Images/{0}", imageName);
        f = System.Web.Hosting.HostingEnvironment.MapPath(f);
        if (File.Exists(f))
        {
            if (f != null) File.Delete(f);
        }
    }
}

为什么会发生这种情况?

【问题讨论】:

  • 这感觉像是权限问题。可以删除的文件与不能删除的文件的权限是否有所不同?

标签: c# exception io


【解决方案1】:

我遇到了同样的问题,发现编写自己的 Directory.Delete 包装器解决了这个问题。这是默认递归的:

using System.IO;

public void DeleteDirectory(string targetDir)
{
    File.SetAttributes(targetDir, FileAttributes.Normal);

    string[] files = Directory.GetFiles(targetDir);
    string[] dirs = Directory.GetDirectories(targetDir);

    foreach (string file in files)
    {
        File.SetAttributes(file, FileAttributes.Normal);
        File.Delete(file);
    }

    foreach (string dir in dirs)
    {
        DeleteDirectory(dir);
    }

    Directory.Delete(targetDir, false);
}

【讨论】:

  • caioproiete.net/en/… 是怎么回事?
  • 我不确定你的意思?我看到它是一个类似的功能......但不完全相同......当我以前使用它时,它工作得很好......不过现在已经有一段时间了!
  • File.SetAttributes() 拯救了我的一天:我没有注意到我试图删除的文件是只读的 oO'
  • 这是正确答案!!我已经为这个错误苦苦挣扎了好几天,因为它删除的只是内部文件而不是文件夹本身。我正在使用 libgit2sharp 并尝试删除克隆的存储库,以便重新克隆它。谢谢!
【解决方案2】:

如果目录包含只读文件,则不会使用 Directory.Delete 删除该文件。这是MS的愚蠢实现。

我很惊讶没有人在互联网上建议这种方法,它删除目录而不递归它并更改每个文件的属性。是这样的:

Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 

(稍微改变一下,不要立即触发 cmd 窗口,这在整个互联网上都可用)

【讨论】:

  • 我不认为这很愚蠢。如果您手动“删除”它,您实际上是将其移至回收站。
  • @DaveVandenEynde 取决于,我通常使用 shift+del 来永久删除文件。
  • 这是我一直在寻找的解决方案,谢谢
【解决方案3】:

如果它不是只读的,则它可能正在被另一个进程使用。

【讨论】:

  • 不回答,最好是评论
  • @Kiquenet:为什么这不是一个答案?事实上,这就是发生在我身上的事情。只是,实际上是进程本身试图删除它。 (我不小心在我的更新脚本中引用了一个项目。)
【解决方案4】:

先检查明显的...

当您打开文件属性并查看其安全设置时。运行代码的用户(即,如果这是 ASP.NET,网络服务/域服务帐户)是否有权实际删除文件? 如果不是,请更改它并重试。

您在尝试手动删除时是否以管理员身份运行? 如果是,那么这可能就是您能够手动删除它的原因。尝试将其作为运行 ASP.NET 的帐户删除(我假设它是 ASP.NET,因为您使用的是 System.Web.Hosting.HostingEnvironment.MapPath。)

如果两者都失败,请尝试查看当前是否有任何其他进程正在使用该文件。查找的好工具是SysInternal Process Monitor。通过包含您的文件名的路径过滤它,您应该查看是否有任何东西在使用它。终止进程并重试。

【讨论】:

  • +1 用于 sysinternal 工具(直到现在,我都不知道如何使用任何 sysinternal 工具)
  • 尝试删除正在使用的文件会引发 UnauthorizedAccessException?我会期待另一种类型的异常,因为它不是权限问题。
【解决方案5】:

我也遇到了同样的问题,但最终想出了一个通用的方法。以下是我的代码。

String pathfile =  "C:\Users\Public\Documents\Filepath.txt" ;

if (!Directory.Exists(pathfile))
{
    File.SetAttributes(pathfile, FileAttributes.Normal);
    File.Delete(pathfile);
}


using (FileStream fs = File.Create(pathfile))
{
    Byte[] info = new UTF8Encoding(true).GetBytes("What Ever Your Text is");
                                  
    fs.Write(info, 0, info.Length);
    File.SetAttributes(pathfile, FileAttributes.ReadOnly);
                    
}

【讨论】:

    【解决方案6】:

    作为人类用户,您拥有具有特定权限的登录。 Web 服务器可能有不同的登录名和不同的权限。以 IUSR_XXXX 或类似名称开头的用户。确保用户对该目录具有权限。

    如果没有关于您删除文件的上下文的更多信息,我假设 Web 服务器用户对文件的权限与您不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多