190

我在尝试删除文件时遇到问题,但出现异常。

if (result == "Success")
{
     if (FileUpload.HasFile)
     {
         try
         {
              File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
              string filename = Path.GetFileName(btnFileUpload.FileName);
              btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
         }
         catch (Exception ex)
         {
               Message(ex.ToString());
         }
      }
}

另外我应该注意,我试图从中删除的文件夹对网络服务具有完全控制权。

完整的异常消息是:

System.UnauthorizedAccessException:对路径“C:\Users\gowdyn\Documents\Visual Studio 2008\Projects\hybrid\hybrid\temp_loginimages\enviromental.jpg”的访问被拒绝。在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 在 System.IO.File.Delete(String path) 在 hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click(Object sender, EventArgs e) 在 C:\Users\gowdyn\ Documents\Visual Studio 2008\Projects\hybrid\hybrid\User_Controls\Imgloader_Add_Edit_Tbl.ascx.cs:line 242

有任何想法吗?

4

32 回答 32

238

根据File.Delete 方法...

AnUnauthorizedAccessException意味着以下四件事之一:

  • 调用者没有所需的权限。
  • 该文件是一个正在使用的可执行文件。
  • 路径是一个目录。
  • Path 指定了一个只读文件。
于 2014-07-17T06:15:48.053 回答
191

我也有这个问题,因此我偶然发现了这篇文章。我在复制/删除之前和之后添加了以下代码行。

删除

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

复制

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);
于 2012-07-17T13:12:07.407 回答
32

这是一个老问题,但我在搜索时遇到了它。原来我在 SaveAs 的保存路径中缺少实际的文件名组件...

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD
于 2013-12-10T23:44:18.063 回答
23

当用户尝试连接到您的网站时,IIS 将连接分配给IUSER_ComputerName帐户,其中 ComputerName 是运行 IIS 的服务器的名称。默认情况下,IUSER_ComputerName帐户是来宾组的成员。该组有安全限制。尝试对该文件夹的 IUSER_ComputerName 访问权限

是关于 IIS 安全性的很好描述的答案

希望这可以帮助

于 2012-01-11T15:05:03.733 回答
15

我收到错误是因为我没有意识到目标应该是一个文件。我有一个文件夹作为第二个参数(在 cmd 中工作)。我得到了Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.因为 C#File.Move想要一个文件,不仅是第一个参数,第二个参数也是如此,所以如果你把一个目录作为第二个参数,它会尝试写一个文件,就像c:\crp你有一个名为c:\crp.

这是不正确的 File.Move(args[0],"c:\\crp");

所以,这将是正确的 File.Move(args[0],"c:\\crp\\a.a");

这同样适用于File.Copy

于 2016-04-26T11:11:47.360 回答
14

右键单击 Visual Studio,然后单击 以管理员身份运行

于 2016-02-24T15:59:20.777 回答
9

如果这是有问题的 IIS 网站,请检查该网站或应用程序使用的应用程序池的高级设置的 Identity 属性。您可能会发现它设置为 ApplicationPoolIdentity,在这种情况下,这就是必须有权访问该路径的用户。

或者您可以采用旧样式,只需将身份设置为网络服务,并让网络服务用户访问路径。

于 2014-08-21T08:11:26.200 回答
5

您需要修改要从中删除/保存到的文件夹的权限。右键单击包含文件夹并使用“安全”选项卡为运行您的应用程序的用户授予修改权限。

于 2012-01-11T15:04:45.893 回答
5

对我来说也是同样的问题,我指向的是文件夹而不是文件。

所以确保在路径中,给出路径+文件名

System.IO.File.WriteAllBytes("path", bytearray);
于 2018-11-16T14:21:16.333 回答
5

当我的窗口服务开始抛出异常时,我也遇到了这个问题

System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.

因此,作为解决方案,我检查了与我的服务关联的用户帐户,如下面的屏幕截图所示

在此处输入图像描述

所以就我而言,它是网络服务

然后转到文件夹属性检查关联的用户帐户是否也存在于其权限选项卡下。它在我的情况下丢失了,当我添加它并解决了我的问题时。

有关更多信息,请查看以下屏幕截图

在此处输入图像描述

于 2018-08-02T12:07:54.250 回答
5

当操作系统由于 I/O 错误或安全错误而拒绝访问时,将引发 UnauthorizedAccessException 异常。

如果您尝试访问文件或注册表项,请确保它不是只读的

于 2018-06-19T04:13:25.737 回答
4

当操作系统由于 I/O 错误或特定类型的安全错误而拒绝访问时引发的异常。

我碰到了同样的事情。检查以确保文件未隐藏。

于 2012-06-28T20:16:51.920 回答
3

检查您的文件属性。如果选中了只读,请取消选中它。这是 UnauthorizedAccessException 的个人问题。

于 2014-07-03T14:26:55.870 回答
3

我得到了这个错误并在短时间内解决了它。不知道为什么我所有的文件夹都是只读的,我取消了只读并应用了。但是,它仍然是只读的。所以我将文件移动到根文件夹中,它可以工作 - 太奇怪了。

于 2016-06-21T02:51:04.470 回答
2

我遇到了这个错误,因为

有时当我使用文件名Combine路径FileName = ""

如上所述,Path Directory不是file一个问题

所以你必须FileName像这样检查

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
于 2016-06-21T09:57:36.287 回答
2

我试图使用 System.IO.File.OpenWrite(path)

它不起作用,因为我只是将 OpenWrite() 传递给目录的路径,但它需要一个路径一直到要写入的文件。因此,需要将包含末尾 filename.extension 的完整路径传递给 OpenWrite 以避免 UnauthorizedAccessException

于 2019-01-22T19:03:52.657 回答
2

为了解决这个问题,我在Debugging System.UnauthorizedAccessException(通常后面跟着:Access to the path is denied)文章中遵循了 Scot Hanselman 的方法,示例代码如下:

class Program
{
    static void Main(string[] args)
    {
        var path = "c:\\temp\\notfound.txt";
        try
        {
            File.Delete(path);
        }
        catch (UnauthorizedAccessException)
        {
            FileAttributes attributes = File.GetAttributes(path);
            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                attributes &= ~FileAttributes.ReadOnly;
                File.SetAttributes(path, attributes);
                File.Delete(path);
            }
            else
            {
                throw;
            }
        }
    }
}
于 2020-06-03T01:42:33.033 回答
1

I had the same problem on a newly moved website on a shared server. Solved through the web host panel (DotNetPanel) setting true the "allow write permissions". So if you are in a shared server before reviewing all code worth taking a look at the server configuration and could save you a lot of time.

于 2013-07-19T19:31:12.613 回答
1

请注意,如果您尝试从代码中访问共享文件夹路径,您不仅需要通过安全选项卡为物理文件夹授予适当的权限。您还需要通过“共享”选项卡与相应的应用程序池用户“共享”该文件夹

于 2013-07-22T20:20:30.137 回答
1

对于那些试图制作 UWP(通用 Windows)应用程序的人来说,文件权限受到更多限制,通常默认情况下是拒绝的。它还取代了系统用户权限。您基本上只能访问任何一个中的文件

  • 您的安装位置
  • 您的 AppData 位置
  • 通过文件文件夹选择器选择的文件
  • 您的应用清单中请求的位置

您可以在此处阅读更多详细信息 => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

于 2019-01-30T21:12:50.143 回答
1

就我而言,问题是诺顿。我的内部程序没有正确的数字签名,当它试图删除一个文件时,它给出了 UnauthorizedAccessException。

在此处输入图像描述

如果它给你一个通知,你可以从那里处理它。就我而言,它没有发出我注意到的通知。所以这里是如何防止诺顿阻止程序。

  1. 打开诺顿
  2. 单击向下箭头
  3. 点击历史
  4. 按计划查找活动
  5. 点击更多选项
  6. 单击排除进程
于 2020-02-14T18:11:34.313 回答
1

如果您使用的是 BitDefender,它的安全文件功能很有可能会阻止您的操作。这是一种带有一些更高级版本的勒索软件保护形式。

确保在 BitDefender 中授予您的应用程序访问权限,然后重试。

更多细节可以在这个 BitDefender 支持页面中找到。

于 2019-02-04T21:22:33.300 回答
1

就我而言,是我的 AVG 防病毒软件触发了异常。

我将我的 VS Projects 目录添加到“允许”列表中。.exe在将可执行文件复制到我的 App 目录后,我必须将可执行文件添加到 AVG 例外列表中。

于 2021-02-08T18:00:24.373 回答
1

删除文件时我遇到了确切的错误。它是在服务帐户下运行的 Windows 服务,即使它完全控制文件夹,也无法从共享文件夹中删除 .pdf 文档。

对我有用的是导航到共享文件夹的安全选项卡 > 高级 > 共享 > 添加。

然后我将服务帐户添加到管理员组,应用更改,然后服务帐户能够对该文件夹中的所有文件执行所有操作。

于 2018-08-01T10:02:04.967 回答
0

当我试图在移动或创建文件夹后非常快速地重命名文件夹时,我遇到了这个错误。

一个简单的System.Threading.Thread.Sleep(500);解决它:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}
于 2014-09-18T20:42:19.543 回答
0

在服务器上部署后尝试执行此操作时,我也遇到了同样的问题:

dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
    DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);

我将 IIS 中的权限授予包括管理员在内的其他组,我的问题得到了解决。

于 2012-02-01T12:14:40.290 回答
0

我发现这个错误可能发生在设计模式中,而不是?执行模式...如果您正在执行诸如创建需要访问 .INI 或 .HTM 文件(配置文件、帮助文件)的类成员之类的操作,您可能不想在声明中初始化该项目,但稍后再对其进行初始化在 FORM_Load() 等中...当您初始化时...使用保护 IF 语句:

    /// <summary>FORM: BasicApp - Load</summary>
    private void BasicApp_Load(object sender, EventArgs e)
    {
        // Setup Main Form Caption with App Name and Config Control Info
        if (!DesignMode)
        {
            m_Globals = new Globals();
            Text = TGG.GetApplicationConfigInfo();
        }
    }

这将阻止 MSVS 设计器在您处于设计模式时尝试创建 INI 或 HTM 文件。

于 2014-02-17T14:09:19.057 回答
0

我遇到了同样的问题,我设法通过更改将保存文件的分区来使其工作。因此,在第 5 行,我将 @"C:\" 更改为 @"D:\" 并解决了问题。

static void SaveVideoToDisk(string link)
{
    var youTube = YouTube.Default; // starting point for YouTube actions
    var video = youTube.GetVideo(link); // gets a Video object with info about the video
    File.WriteAllBytes(@"D:\" + video.FullName, video.GetBytes());
}
于 2021-04-30T08:25:10.157 回答
0

我也在处理同样的问题时遇到了这篇文章。看起来该文件正在使用中,因此无法写入。虽然无法弄清楚,哪个进程正在使用它。退出在该框中登录的其他用户,看不到任何持有它的用户。有关如何找到相同内容的任何快速提示。

谢谢, Lakshay(开发人员)

于 2019-09-14T01:41:23.687 回答
0

在我的特殊情况下,我反复创建和删除 10000 个文件夹。在我看来,问题在于虽然方法Directory.Delete(path, true)返回,但底层操作系统机制可能仍在从磁盘中删除文件。当我在删除旧文件夹后立即开始创建新文件夹时,其中一些仍然被锁定,因为它们还没有完全删除。我得到 System.UnauthorizedAccessException:“访问路径被拒绝”。

在此处输入图像描述

使用Thread.Sleep(5000)afterDirectory.Delete(path, true)解决了这个问题。我绝对同意这是不安全的,我不鼓励任何人使用它。我很想在这里找到一种更好的方法来解决这个问题,以改进我的答案。现在我只是想知道为什么会发生这种异常。

class Program
{
    private static int numFolders = 10000;
    private static string rootDirectory = "C:\\1";

    static void Main(string[] args)
    {
        if (Directory.Exists(rootDirectory))
        {
            Directory.Delete(rootDirectory, true);
            Thread.Sleep(5000);
        }

        Stopwatch sw = Stopwatch.StartNew();
        CreateFolder();
        long time = sw.ElapsedMilliseconds;

        Console.WriteLine(time);
        Console.ReadLine();
    }

    private static void CreateFolder()
    {
        var one = Directory.CreateDirectory(rootDirectory);

        for (int i = 1; i <= numFolders; i++)
        {
            one.CreateSubdirectory(i.ToString());
        }
    }
}
于 2018-08-21T06:37:42.653 回答
0

首先检查驱动器号后是否缺少冒号(:) 字符的路径。如果没有缺少冒号,那么您可以检查是否为该路径授予了访问/写入权限。我有同样的问题,我只是错过了冒号,许可,其他一切都很好。

C:\folderpath

会正常工作,但是,

C\folderpath .........(missing colon)

会给你访问拒绝错误。

于 2018-11-14T13:50:33.857 回答
0

从 迁移Visual Studio 2017到后,Visual Studio 2019我的两个应用程序在以下条件下正常运行时遇到了两个异常Visual Studio 2017

  • System.UnauthorizedAccessException
  • System.ArgumentException

事实证明,我必须将这两个应用程序的可执行文件添加到Avast Antivirus.

于 2021-10-12T10:31:17.867 回答