为什么拒绝访问路径?


156

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

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'。C:\ Users \ gowdyn \文档\ Visual Studio 2008 \项目\混合\混合\ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs:第242行

有任何想法吗?


4
有什么不清楚的例外?应用程序运行所在的帐户没有文件/文件夹访问权限。
奥德

8
我知道例外在说什么。问题是一些需要使用系统修改图像的用户使用了此功能。其中一部分是通过删除旧图像并保存新图像来替换图像。
尼克·高迪(Nick Gowdy)2012年

检查您对该文件夹的访问权限。使用属性窗口中的“安全性”选项卡为文件夹授予适当的权限
gasroot

6
例外根本没有提供信息。它不会告诉您:A.什么主体试图访问资源B.它需要什么权限。为了找出答案,它需要安装Windows SysInternals并监视路径访问。
ATL_DEV

Answers:


184

根据File.Delete方法 ...

An UnauthorizedAccessException表示以下四件事之一:

  • 呼叫者没有所需的权限。
  • 该文件是正在使用的可执行文件。
  • 路径是目录。
  • 路径指定了一个只读文件。

76
路径是目录。对我来说很尴尬:/
Per G

4
昨天发生在我身上的脸蛋。我讨厌这个模棱两可的异常消息:(
Broken_Window

1
我挣扎了6个小时以上,在查看您的回复后看到路径是目录...感谢一吨@CrazyTim ..
用户M

6
Path is a directory.谢谢你的提示:)它帮助了我。
Sidron '17

8
哦,我的...路径是目录。谢谢微软。这是非常未经授权的访问。
认真的M

181

我也遇到了问题,因此我在这篇文章上跌跌撞撞。我在“复制/删除”之前和之后添加了以下代码行。

删除

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

复制

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);

17
我授予“所有人”对该文件夹的完全权限,但没有成功。这些文件属性以某种方式起作用。谢谢。我希望MS能够最终选择合适的安全模型。至少可以说,试图弄清楚为什么“复制/删除”每隔几年就会爆炸的原因。
史蒂夫

13
SetAttributes Normal是我的窍门-我正在尝试File.Copy并覆盖一个只读文件。.–
Tom Hunter

6
拒绝访问该路径并不表示该文件只是只读的(因为您实际上确实可以访问该路径!)在我看来,应该更改错误消息。还是谢谢你的提示!
MBoros 2014年

1
我以管理员身份运行程序,问题不再存在。
圣地亚哥·维拉富尔特

5
复制操作后设置属性有何帮助?程序不会在复制语句上崩溃吗?像删除操作一样应该在复制操作之前吗?
Vibhore Tanwer's

31

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

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD

18

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

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

希望这可以帮助


谢谢您的帮助。.IIS_IUSRS用户的权限。
汤姆


13

我收到错误消息是因为我没有意识到目的地应该是文件。我有一个文件夹作为第二个参数(在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


1
谢谢!这间接解决了一个问题,即API期望将我指定的目的地作为目录,而没有意识到它必须包含文件名(因为对象本身具有关联的文件名)。
奥斯丁·萨尔加特

7

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

或者,您可以采用旧样式,只需将“身份”设置为“网络服务”,然后向网络服务用户授予对路径的访问权限。


3

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


您假设他是他的计算机的管理员。.如果这是一台工作计算机,而他只是一个用户..他们可能出于某种原因以这种方式设置了权限。.因为我们只能假设
MethodMan

1
这是一台工作机器,我是高级用户。我没有以管理员身份登录。图像文件夹的属性已被修改,因此网络服务具有完全访问权限。但这没有任何区别。
尼克·高迪(Nick Gowdy)2012年

1
我刚刚添加了对文件夹具有完全访问权限的“所有人”和“voilá”
MarceloBarbosa

3

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

我碰到同样的东西。检查以确保文件未隐藏。


3

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

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

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

在此处输入图片说明

所以在我的情况下是网络服务

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

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

在此处输入图片说明


3

我也遇到同样的问题,我指的是文件夹而不是文件。

因此请确保在路径中输入path + filename

System.IO.File.WriteAllBytes("path", bytearray);

2

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


2

我收到此错误,并在片刻内解决了该错误。不知道为什么我所有的文件夹都是只读的,我取消了只读并应用了它。但是,它仍然是只读的。所以我将文件移到了根文件夹,它可以正常工作-很奇怪。


2

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

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



1

在共享服务器上新移动的网站上,我遇到了同样的问题。通过Web主机面板(DotNetPanel)设置为true即可解决“允许写权限”。因此,如果您在共享服务器之前检查所有值得查看服务器配置的代码,则可以节省大量时间。


1

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


1

我遇到此错误是因为

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

它成为Path Directory不是一个file,其是作为问题如上所述

所以你必须检查是否有FileName这样的

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));

1

删除文件时出现确切错误。它是在“服务帐户”下运行的Windows服务,即使该帐户具有“完全控制”权限,也无法从共享文件夹中删除.pdf文档。

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

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



1

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

在此处输入图片说明

如果它给您通知,则可以从那里进行处理。就我而言,它没有发出我注意到的通知。因此,这是防止Norton阻止程序的方法。

  1. 打开诺顿
  2. 点击向下箭头
  3. 点击记录
  4. 按计划查找活动
  5. 单击更多选项
  6. 点击排除流程

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中向包括管理员在内的其他组授予了权限,问题得到解决。


0

我发现在DESIGN MODE中可能会发生此错误,而不是?执行模式...如果您正在执行诸如创建需要访问.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 Designer不能尝试创建INI或HTM文件。


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);      
   }   
}

如果您在移动文件夹之前检查该文件夹是否存在而不是休眠半秒钟,那会比较好...如果操作系统繁忙,则上一次移动可能要花费半秒钟以上的时间,并且您回到相同的问题。
Paul Zahra

这段代码非常危险。无论抛出什么异常,它都会重复RenameFile方法!如果异常的原因是实际的权限问题,则可能导致应用程序崩溃
Hossein Shahdoost 2016年

0

在我的特定情况下,我反复创建和删除10000个文件夹。在我看来,问题在于,尽管该方法Directory.Delete(path, true)返回了,但底层的OS机制仍可能正在从磁盘中删除文件。当我删除旧文件夹后立即开始创建新文件夹时,其中一些仍处于锁定状态,因为它们尚未完全删除。而且我正在获得System.UnauthorizedAccessException:“拒绝访问路径”。

在此处输入图片说明

使用Thread.Sleep(5000)after Directory.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());
        }
    }
}

0

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

C:\folderpath

会很好,但是,

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

将给您访问拒绝错误。


0

我正在尝试使用System.IO.File.OpenWrite(path)

而且它不起作用,因为我只向OpenWrite()传递了目录的路径,但是它始终需要一个指向您要写入的文件的路径。因此,需要将包含结尾的filename.extension的完整路径传递到OpenWrite中,以避免UnauthorizedAccessException


0

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

谢谢,Lakshay(开发人员)


在您的答案中,不要发布新问题,而是尝试使用有用的信息来回答原始海报的问题。对于您自己的问题,请首先搜索stackoverflow以查找相同或相似的问题。如果你没有找到任何,发布新问题这个指南:如何问一个很好的问题
ALEV

0

为了解决此问题,我遵循Debugging System.UnauthorizedAccessException(通常后面是:拒绝访问路径)一文中的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;
            }
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.