删除文件,但访问被拒绝

时间:2014-10-26 19:33:17

标签: c# windows entity-framework asp.net-mvc-4 visual-studio-2013

我有一个带有实体框架的mvc4应用程序。

我想删除一个文件,但每次都说:

mscorlib.dll中发生了'System.UnauthorizedAccessException'类型的异常,但未在用户代码中处理

其他信息:访问路径'G:\ Mijn Documents \ My Web Sites \ Lolabikes - Copy \ C#\ ContosoUniversity \ Images \'被拒绝。

这一行:System.IO.File.Delete(path);

这是方法:

public ActionResult DeleteFiles(int id)
        {           
                //var fileName = Path.GetFileName(id.FileName);

                var DirSeparator = Path.DirectorySeparatorChar;
                var path = Server.MapPath("~\\Images" + DirSeparator);// + fileName.Replace('+', '_')));
               var file = db.lolabikerPhotos.Find(id);               
               System.IO.File.Delete(path);
               db.SaveChanges();           

            return Redirect(Url.Action("Edit", "Account") + "#tabs-3");

        }

我只是在visual studio中运行应用程序,如下所示:http://localhost:41787/Account/Edit?UserId=hallo

我已经做了以下事情:

完全访问地图,我将网络服务添加到地图并完全控制。但似乎没有任何效果。我正在使用Windows 7.我以管理员身份运行visual studio 2013

我也看到了这个:

ASP.NET is not authorized to access the requested resource. Consider granting access rights to the resource to the ASP.NET request identity. ASP.NET has a base process identity (typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6 and IIS 7, and the configured application pool identity on IIS 7.5) that is used if the application is not impersonating. If the application is impersonating via <identity impersonate="true"/>, the identity will be the anonymous user (typically IUSR_MACHINENAME) or the authenticated request user.

您可以在此处查看访问权限:

enter image description here

我尝试这样的事情:

 <system.web>

    <identity impersonate="true" userName="Administrator" password="windowsPassword"/>
    <httpRuntime requestValidationMode="2.0"  maxRequestLength="1048576" executionTimeout="3600" />
    <compilation debug="true" targetFramework="4.5" />

    <pages validateRequest="false" />

    <!--<httpRuntime targetFramework="4.5" />-->


  </system.web>

我添加了这个:

<identity impersonate="true" userName="Administrator" password="windowsPassword"/> 

好的,我可以运行该应用,但仍然会出错:

Access to the path 'G:\Mijn Documents\My Web Sites\Lolabikes - Copy\C#\ContosoUniversity\Images\' is denied.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.UnauthorizedAccessException: Access to the path 'G:\Mijn Documents\My Web Sites\Lolabikes - Copy\C#\ContosoUniversity\Images\' is denied. 

ASP.NET is not authorized to access the requested resource. Consider granting access rights to the resource to the ASP.NET request identity. ASP.NET has a base process identity (typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6 and IIS 7, and the configured application pool identity on IIS 7.5) that is used if the application is not impersonating. If the application is impersonating via <identity impersonate="true"/>, the identity will be the anonymous user (typically IUSR_MACHINENAME) or the authenticated request user. 

To grant ASP.NET access to a file, right-click the file in File Explorer, choose "Properties" and select the Security tab. Click "Add" to add the appropriate user or group. Highlight the ASP.NET account, and check the boxes for the desired access.

Source Error: 


Line 489:                var path = Server.MapPath("~\\Images" + DirSeparator);// + fileName.Replace('+', '_')));
Line 490:               var file = db.lolabikerPhotos.Find(id);               
Line 491:               System.IO.File.Delete(path);
Line 492:               db.SaveChanges();           
Line 493:

完全许可:

enter image description here

高级标签: enter image description here

更改权限标签:

enter image description here

我编辑了我的动作方法:

 public ActionResult DeleteFiles(int id)
        {           
                var fileName = Path.GetFileName(@"\\Koala.jpg");

                var DirSeparator = Path.DirectorySeparatorChar;
                var path = Server.MapPath(@"\\Images" + DirSeparator + fileName.Replace('+', '_'));
               var file = db.lolabikerPhotos.Find(id);
               LolaBikePhoto lola = db.lolabikerPhotos.Find(id);
               db.lolabikerPhotos.Remove(lola);
               System.IO.File.Delete(path);


               db.SaveChanges();           

            return Redirect(Url.Action("Edit", "Account") + "#tabs-3");

        }

现在它正在运作!

2 个答案:

答案 0 :(得分:47)

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

删除

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

复制

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

答案 1 :(得分:3)

在答案的基础上 - 对我来说,我必须将文件夹及其中的文件设置为普通属性。 (在VB.NET中)

    Dim di As New DirectoryInfo("file path")

    di.Attributes = FileAttributes.Normal

    For Each fi As FileInfo In di.GetFiles
        fi.Attributes = FileAttributes.Normal
    Next