为什么访问path被拒绝?

我有一个问题,我想删除我的文件,但我得到一个exception。

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

另外我应该注意到,我试图从删除的文件夹完全控制networking服务。

完整的例外信息是:

System.UnauthorizedAccessException:访问path“C:\ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg”被拒绝。 System.IO .__中的System.IO.__错误.WINIOError(Int32错误码,stringmaybeFullPath)在System.IO.File.Delete(stringpath)在hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click(对象发件人,EventArgs e)在C:\用户\ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs:line 242

有任何想法吗?

我也有这个问题,所以我在这个post上磕磕绊绊。 我在复制/删除之前和之后添加了以下代码行。

删除

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

复制

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

根据File.Delete方法 …

UnauthorizedAccessException意味着4件事之一:

  • 来电者没有必要的权限。
  • 该文件是一个正在使用的可执行文件。
  • path是一个目录。
  • path指定一个只读文件。

这是一个老问题,但我在search时遇到了这个问题。 原来,我错过了保存path中的实际文件名组件SaveAs …

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

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

这里是关于IIS安全的非常好的描述答案

希望这可以帮助

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

或者你也可以走旧风格,简单地将身份设置为networking服务,并让networking服务用户访问path。

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

我得到了错误,因为我没有意识到dest应该是一个文件。 我有一个文件夹作为第二个参数(在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\\aa");

File.Copy

操作系统由于I / O错误或特定types的安全错误而拒绝访问时引发的exception。

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

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

我在共享服务器上新移动的网站上遇到同样的问题。 解决通过networking主机面板(DotNetPanel)设置真正的“允许写入权限”。 因此,如果您在共享服务器中查看所有值得查看服务器configuration的代码,并且可以为您节省大量时间。

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

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

在服务器部署之后,我也遇到了同样的问题:

 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的权限授给了包括pipe理员在内的其他小组,我的问题解决了。

我发现这个错误可能发生在devise模式而不是? 执行模式…如果您正在执行某些操作,如创build需要访问.INI或.HTM文件(configuration文件,帮助文件)的类成员,则可能不希望在声明中初始化该项目,而是稍后进行初始化在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在devise模式下不会尝试创buildINI或HTM文件。

当我尝试在移动或创build后非常快速地重命名文件夹时,发生了此错误。

一个简单的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); } } 

我正面临这个错误,因为

有时当我将path文件名文件名 FileName = ""

它成为Path Directory而不是如上所述的问题的file

所以你必须像这样检查FileName

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

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