我正在尝试从特定位置删除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的iffect?我正在使用那个
答案 0 :(得分: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.aspx alt text http://i.technet.microsoft.com/bb896653.ProcessExplorer(en-us,MSDN.10).jpg
答案 1 :(得分:4)
如果您的代码在IIS下运行,请注意ASPNET用户无权访问计算机文件,您应该访问它,不建议这样做,或者将文件存储在ASPNET用户可以访问的位置
请参阅here
答案 2 :(得分:3)
尝试这两个步骤的组合:
在<system.web>
部分的web.config文件中启用模拟:
<identity impersonate="true"/>
<identity impersonate="true" userName="contoso\Jane" password="password"/>
答案 3 :(得分:2)
我认为该消息很明确,您无权删除该文件或由其他应用程序打开。我打赌2 $你也不能手动删除文件。
答案 4 :(得分:2)
正如其他人所说,这是因为IIS以具有受限访问权限的用户身份运行您的应用程序。这是明智的安全预防措施,因此您的系统不易受到恶意攻击。
您需要做的是让ASPNET用户访问特定文件夹。您可以从文件夹属性中的安全选项卡执行此操作。您需要完全控制的用户取决于您使用的IIS版本。在Windows XP中它是ASPNET。在Windows Server 2003,2008和Windows Vista中,7是NETWORK_SERVICE。
有关详细信息,另请参阅此question。
答案 5 :(得分:1)
确保未打开文件或 被另一个用户/进程锁定。
答案 6 :(得分:1)
确保ASPNET用户可以访问文件\文件夹(使用Windows资源管理器检查文件\文件夹的属性并转到安全选项卡。检查是否添加了ASPNET用户。)
答案 7 :(得分:1)
正在发生两件事之一。文件已经打开,或者运行IIS的用户的权限没有适当的权限。
无论哪种方式,这个实用程序ProcMon:Proc Mon 将帮助您确定问题。运行ProcMon,启动您的进程以尝试删除该文件。然后回到procmon。按Ctrl-E关闭捕获,然后按Ctrl-F查找。输入您要删除的文件的名称。然后,一旦找到了拒绝访问的正确行(或类似错误),请双击该行以获取更多信息。单击“进程”选项卡时,它将显示尝试删除该文件的确切用户。
因此,如果它是文件权限问题,您现在知道确切的用户,因此可以转到文件系统,右键单击包含您要删除的文件的文件夹,并授予该用户读取权限/写/更新该文件夹。
其次,如果文件被锁定打开而不是权限问题,则必须找出保持打开文件的进程。如果您还在代码的另一部分中编写此文件,则可能未正确关闭它或释放对象引用。
答案 8 :(得分:0)
您是否确认该文件没有设置只读属性?
答案 9 :(得分:0)
我认为我们没有足够的信息可以提供帮助。在调用Delete期间,安全上下文(标识)是什么?应用程序是否冒充最终用户?如果是,他们如何进行身份验证?如果是通过Windows / Active Directory,则需要验证该用户对特定文件的访问权限。如果通过Forms登录,那么您可能不应该冒充并验证AppPool的安全上下文是否具有适当的访问权限。