为什么拒绝访问路径?

时间:2012-01-11 14:58:41

标签: c# asp.net io unauthorizedaccessexcepti

我在尝试删除文件时遇到问题但是我遇到了异常。

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'。 at System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)at System.IO.File.Delete(String path)at hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click(Object sender,EventArgs e)in C:\ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs:第242行

有什么想法吗?

31 个答案:

答案 0 :(得分:163)

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

删除

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

复制

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

答案 1 :(得分:139)

根据File.Delete Method ...

UnauthorizedAccessException表示以下四项内容之一:

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

答案 2 :(得分:25)

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

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

答案 3 :(得分:17)

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

Here是关于IIS安全性的非常好的描述

希望这有帮助

答案 4 :(得分:9)

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

也是如此

答案 5 :(得分:8)

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

答案 6 :(得分:6)

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

或者您可以使用旧式并简单地将Identity设置为网络服务,并让网络服务用户访问该路径。

答案 7 :(得分:3)

  

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

我打了同样的话。检查以确保该文件不是隐藏的。

答案 8 :(得分:2)

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

答案 9 :(得分:2)

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

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

答案 10 :(得分:2)

您需要修改您要删除/保存到的文件夹的权限。右键单击包含文件夹,然后使用“安全”选项卡允许修改对应用程序运行的用户的权限。

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

答案 13 :(得分:1)

我遇到了这个错误,因为

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

成为Path Directory而不是file这是一个问题mentioned above

所以你必须检查FileName这样的

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

答案 14 :(得分:1)

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

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

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

答案 15 :(得分:1)

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

len(path) == k

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

enter image description here

因此,在我看来,这是网络服务

然后转到文件夹属性,以检查关联的用户帐户是否也位于其权限标签下。就我而言,它丢失了,当我添加它时,它解决了我的问题。

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

enter image description here

答案 16 :(得分:1)

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

enter image description here

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

  1. 打开Norton
  2. 点击向下箭头
  3. 点击历史记录
  4. 按计划查找活动
  5. 点击“更多选项”
  6. 点击排除过程

答案 17 :(得分:1)

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

答案 18 :(得分:1)

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

因此请确保在路径中输入路径+文件名

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

答案 19 :(得分:0)

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

C:\folderpath

可以正常工作,但是

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

将给您访问拒绝错误。

答案 20 :(得分: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());
}

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

为解决此问题,我在Debugging System.UnauthorizedAccessException (often followed by: 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;
            }
        }
    }
}

答案 23 :(得分:0)

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

谢谢, Lakshay(开发人员)

答案 24 :(得分:0)

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

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

更多详细信息可以在this BitDefender support page中找到。

答案 25 :(得分:0)

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

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

您可以在此处详细了解=> https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

答案 26 :(得分:0)

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

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

答案 27 :(得分:0)

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

enter image description here

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

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

答案 29 :(得分: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文件。

答案 30 :(得分: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);      
   }   
}