UnauthorizedAccessException尝试删除文件夹中的文件,我可以使用相同的代码删除其他文件

eKe*_*ek0 16 c# io exception

我收到了一个未经授权的访问例外

  • 在我可以手动删除的文件中.
  • 在一个文件夹中,我可以通过代码删除其他文件
  • 并且文件未标记为只读
  • 此外,我在独立的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Bra*_*rks 25

我遇到了同样的问题,发现编写自己的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);
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,你解决了我的问题 (2认同)
  • `File.SetAttributes()`保存了我的一天:我没注意到我试图删除的文件只读了oO' (2认同)

Piy*_*oni 6

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

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

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

(稍微更改一下,不要暂时触发cmd窗口,这可以通过互联网获得)

  • @DaveVandenEynde 取决于,我通常使用 shift+del 永久删除文件。 (2认同)

jpo*_*poh 3

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

  • 不回复,最好点赞评论 (4认同)