TransmitFile文件正在被另一个进程使用
本文关键字:进程 另一个 文件 TransmitFile | 更新日期: 2023-09-27 18:11:23
我正在服务器上生成Excel文件,然后立即将其下载给用户。这是我在按钮上的代码点击:
var excelApp = new Excel.Application();
excelApp.Workbooks.Add();
Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
string fileTemporary = "C:''Users''........''Desktop''my folder''";
fileTemporary = fileTemporary + nameOfDocument+".xlsx";
workSheet.SaveAs(fileTemporary);
HttpContext.Current.Response.TransmitFile(fileTemporary);
我得到了文件正在被另一个进程使用的错误,即使我刚刚创建了文件。我将everyone作为用户添加到该文件夹中,并以管理员身份运行vs。
更新:在人们告诉我关闭表单后,我尝试了这个:
Marshal.ReleaseComObject(workSheet);
在调用Transmitfile之前,我一直有这个问题
更新2:我也试过这个:
excelApp.Quit();
更新3:我试过了:
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.FinalReleaseComObject(workSheet);
excelApp.Quit();
Marshal.FinalReleaseComObject(excelApp);
HttpContext.Current.Response.TransmitFile(fileTemporary);
问题是现在我没有得到任何异常,但是没有任何东西被下载
试试这个,这是你的代码,加上一个close和quit
var excelApp = new Excel.Application();
excelApp.Workbooks.Add();
Excel._Worksheet workSheet = (Excel.Worksheet)excelApp.ActiveSheet;
String fileTemporary = "C:''Users''........''Desktop''my folder''";
fileTemporary = fileTemporary + nameOfDocument+".xlsx";
workSheet.SaveAs(fileTemporary);
workSheet.Close(0);
excelApp.Quit();
HttpContext.Current.Response.TransmitFile(fileTemporary);
这对我有用
GC.Collect();
GC.WaitForPendingFinalizers();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workSheet);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excelApp);
如果下载文件是你现在的情况,这是一个web,你可能要考虑使用URL的路径,而不是实际的路径,并通过响应发送回。重定向或响应。AppendHeader
string fileTemporary = "~/TempFiles/";
string actualLoc = fileTemporary.Replace("~",HttpContext.Current.Server.MapPath(""));
if(!Directory.Exists(actualLoc)) { Directory.CreateDirectory(actualLoc); }
string newActualLoc = actualLoc + nameOfDocument + ".xlsx";
string linkLoc = fileTemporary + nameOfDocument + ".xlsx";
workSheet.SaveAs(newActualLoc);
GC.Collect();
GC.WaitForPendingFinalizers();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workSheet);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excelApp);
加重定向
HttpContext.Current.Response.Redirect(linkLoc);
或附加头
HttpContext.Current.Response.AppendHeader("content-disposition","attachment; filename=" + linkLoc);