访问被拒绝错误

3

我试图从特定位置删除Excel文件,但无法删除。出现以下错误:

路径'C:\ mypath \ sample.xlsx'的访问被拒绝。

我编写的代码如下:

protected void imgbtnImport_Click(object sender, ImageClickEventArgs e)
{

    try
    {
        string strApplicationPath = HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath);
        string strXLStoredDirectoryPath = strApplicationPath + "/Information Documents/";
        DirectoryInfo di = new DirectoryInfo(strXLStoredDirectoryPath);
        string fileName = flUpldSelectFile.FileName;
        if (!File.Exists(strXLStoredDirectoryPath))
        {
            Directory.CreateDirectory(strXLStoredDirectoryPath);

            di.Attributes = FileAttributes.Normal;
        }
        string strCreateXLFileDestinationPath = strXLStoredDirectoryPath + fileName;
        if (File.Exists(strCreateXLFileDestinationPath))
        {
            File.Delete(strCreateXLFileDestinationPath);
        }

        flUpldSelectFile.SaveAs(strCreateXLFileDestinationPath);           
        di.Attributes = FileAttributes.ReadOnly;
    }
    catch (Exception)
    {            
        throw;
    }
}

请指导……

-*********************************************************************** 仍然存在问题。它没有得到解决。出现UnauthorizedAccessException错误,因为无法删除文件的访问被拒绝。我已经很累了,请帮忙;我尝试了很多方法……请帮忙。 -*********************************************************************** 这可能是VSS的影响吗?我正在使用它。


你的文件系统设置正确吗?你必须设置这些才能执行删除等操作。 - Younes
我们需要知道这是否是一个asp.net应用程序。 - jinsungy
你尝试使用我建议的工具来查看文件是否被锁定了吗?另外,是什么创建了这个文件?如果是同一个应用程序,请展示创建/保存该文件的代码。我遇到过这种情况很多次,并且能够相当快速地诊断出问题所在。 - Brian
2
啊,匈牙利命名法!我的眼睛! - Joel Mueller
10个回答

11

更新:

你的问题可能部分原因是保存/创建该文件的方式。如果你使用内置的“保存”或“另存为”功能,底层文件流可能仍然锁定该文件。编写自己的保存逻辑,使用FileStream包装在Using语句中可以帮助您在完成时立即处理流,从而允许您在同一上下文中进一步操作文件。

如果flUpldSelectFile.SaveAs(strCreateXLFileDestinationPath);是仅保存文件的逻辑,则摆脱内置的SaveAs功能。编写自己的保存逻辑,使用FileStream包装在Using块中。

在您的示例中,我看不到flUpldSelectFile是什么,所以我假设它是System.Web.UI.WebControls.FileUpload控件。这里是一个示例,展示如何编写自己的保存逻辑。

using (FileStream fs = new FileStream(strCreateXLFileDestinationPath, FileMode.Create))
{        
    byte[] buffer = flUpldSelectFile.FileBytes;
    fs.Write(buffer, 0, buffer.Length);
}

如前所述,使用此工具查找文件以查看是否有其他进程锁定了该文件。

原始内容

打开这个神奇的工具,搜索那个文件,看看是谁/什么锁住它

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspxalt text
(来源:microsoft.com)


+1 - 我认为这个不应该被否定。它可能不是一个与编程有关的修复,但可以用作调试工具。 - Ramesh
这个工具可以解决各种编程难题。我也给你点赞。 - Hugh Brackett
+1 Process Explorer 真是太棒了!我的猜测是,他锁定了自己的文件,因为他没有关闭它... - Hinek

4

如果您的代码在IIS下运行,注意ASPNET用户无法访问计算机文件,您应该给予它访问权限,但这并不推荐,或者将文件存储在ASPNET用户可以访问的地方

请参见此处


假设这是关于一个ASP.NET应用程序,你的答案可能是正确的。 - jinsungy
在将应用程序部署到服务器后访问时,我遇到了这个错误。但是在本地主机上运行它时,它完全正常。让我检查一下你的链接。 - Red Swan
首先在开发服务器上创建一个文件夹,然后将完全访问权限授予ASPNET用户,仅限于该文件夹。 - Arsen Mkrtchyan
我猜想你在"imgbtnImport_Click"函数之外的某处访问(读取或写入)了那个文件。你是否正确关闭了该文件?你能展示一下访问该文件的代码片段吗? - Arsen Mkrtchyan

3
尝试以下两个步骤的组合:
1. 将IIS应用程序池设置为在具有特权的帐户下运行,例如域帐户或本地用户帐户(而不是像本地服务或本地系统这样的默认帐户)。 IIS7说明。 2. 在web.config文件的部分中打开模拟功能:
<identity impersonate="true"/> <identity impersonate="true" userName="contoso\Jane" password="password"/>

请问您能否将此步骤发送给我? - Red Swan
更新了。您正在运行哪个版本的IIS? - bkaid

2

我认为信息很明确,你没有权限删除该文件或者它正在被其他应用程序打开。我敢打赌2美元,你也无法手动删除该文件。


是的,如果这是一个访问权限问题,File.Exists会返回false。有人锁定了它。 - user1228
1
你会失败的,也许服务器正在使用其他凭据工作;)我猜这是一个asp.net项目。 - Arsen Mkrtchyan
我想是这样...但我认为背后可能有一些正在进行的过程...可能是这个原因。 - Red Swan
@ArsenMkrt 你可能对ASP.Net的看法是正确的,我没有注意到HttpContext.Current.Request.MapPath()的调用。关于授权,我可能仍然是正确的,但由于赌注是关于无法手动删除,所以这里有2美元...你抓住了吗;-) - Marcel Gosselin
仍然存在问题。它没有解决。出现了UnauthorizedAccessException错误,因为无法删除文件而被拒绝访问。我已经很累了。请帮忙;我尝试了很多方法..请帮忙。 - Red Swan

2
正如其他人所说,这是因为IIS将您的应用程序作为具有受限访问权限的用户运行。这是一个明智的安全预防措施,使您的系统更不容易受到恶意攻击。
您需要做的是给ASPNET用户访问特定文件夹的权限。您可以在文件夹属性的安全选项卡中完成此操作。您需要赋予完全控制权的用户取决于您使用的IIS版本。在Windows XP中,它是ASPNET。在Windows Server 2003、2008和Windows Vista、7中,它是NETWORK_SERVICE。
有关更多详细信息,请参见此问题

1

确保文件未被其他用户/进程打开或锁定。


1

确保ASPNET用户对文件/文件夹有访问权限(使用Windows资源管理器检查文件/文件夹的属性并转到安全选项卡,检查是否已添加ASPNET用户)。


1

两种情况之一正在发生。文件已经打开或运行IIS的用户权限不正确。

无论哪种方式,此实用程序ProcMon:Proc Mon将帮助您确定问题。运行ProcMon,启动进程以尝试删除文件。然后返回到procmon。按Ctrl-E关闭捕获,然后按Ctrl-F查找。输入您要删除的文件的名称。然后,一旦找到具有访问被拒绝(或类似错误)的正确行,请双击该行以获取更多信息。单击“进程”选项卡时,将显示试图删除文件的确切用户。

因此,如果是文件权限问题,则现在知道确切的用户,因此可以转到文件系统右键单击包含要删除的文件的文件夹,并授予该用户读取/写入/更新该文件夹的权限。

其次,如果文件未能打开是由于另一个进程正在使用它而非权限问题,你需要找出是哪个进程占用了该文件。如果在代码的其他部分也在写入该文件,可能是没有正确关闭或释放对象引用所致。


0
你确认文件没有设置只读属性吗?

0
我认为我们没有足够的信息来提供帮助。在调用Delete时,安全上下文(身份)是什么?应用程序是否冒充最终用户?如果是这样,他们是如何进行身份验证的?如果是通过Windows / Active Directory进行身份验证,则需要验证该用户对特定文件的访问权限。如果是通过表单登录进行身份验证,则您可能不应该冒充并验证AppPool的安全上下文是否具有适当的访问权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接