1

我正在尝试使用 C# 读取 Excel 工作表,该工作表将由最终用户从 fileUpload 控件加载。

我正在编写代码以将服务器上的文件保存在另一个按钮控件(上传)的事件处理程序中。但是当我点击上传按钮时,我得到了这个异常:

该进程无法访问文件“E:\MyProjectName\App_Data\sampledata.xlsx”,因为它正被另一个进程使用。

这是我在事件处理程序中使用的代码:

string fileName = Path.GetFileName(file_upload.PostedFile.FileName);
string fileExtension = Path.GetExtension(file_upload.PostedFile.FileName);
string fileLocation = Server.MapPath("~/App_Data/" + fileName);
//if (File.Exists(fileLocation))
//    File.Delete(fileLocation);
file_upload.SaveAs(fileLocation);

即使删除文件也不起作用,抛出相同的异常。

4

3 回答 3

2

确保其他进程没有访问该文件。

每当您尝试上传文件,而不是从内存中明确删除它时,都可能会发生此错误。

所以试试这个:

try
{
    string fileName = Path.GetFileName(file_upload.PostedFile.FileName);
    string fileExtension = Path.GetExtension(file_upload.PostedFile.FileName);
    string fileLocation = Server.MapPath("~/App_Data/" + fileName);
    //if (File.Exists(fileLocation))
    //    File.Delete(fileLocation);
    file_upload.SaveAs(fileLocation);
}
catch (Exception ex)
{
    throw ex.Message;
}
finally
{
    file_upload.PostedFile.InputStream.Flush();
    file_upload.PostedFile.InputStream.Close();
    file_upload.FileContent.Dispose();    
    //Release File from Memory after uploading
}
于 2012-11-28T11:34:28.853 回答
0

引用挂在内存中,如果您使用 Visual Studio,请尝试使用 Clean Solution 并再次重建,如果您在 IIS 中,只需回收您的应用程序。

为避免此问题,请在使用文件后尝试处理它们,例如:

using(var file= new FileInfo(path))
{
   //use the file
  //it will be automatically disposed after use
}
于 2012-11-28T11:30:32.990 回答
0

如果我正确理解了场景。对于上传控件,我认为您不必为上传按钮编写代码。当您单击按钮时,您的上传控件已锁定文件并使用它,因此它已被一个进程使用。为按钮编写的代码将是另一个过程。在此之前,请检查您的文件是否未在任何地方打开并等待编辑。

于 2012-11-28T11:43:08.990 回答