一段下载文件的代码,运行时第一次会出错,错误信息说下载的文件被其他进程使用,但是重新打开页面再次下载就没有任何问题,单步调试也没有任何问题。
代码如下:
private void OpenFile(string StrFileName,string StrUnitName)
{
         Response.Clear();
Response.ClearHeaders();
Response.BufferOutput = true;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(TxtBeginData.Text.Trim().ToString() + "_台帐_" + StrUnitName + ".xls", Encoding.UTF8)); CloseAllExcel();//结束EXCEL进程
Response.WriteFile( StrFileName );//这一行是有错误的时候提示的错误行
Response.Flush();
File.Delete(StrFileName);
Response.End();
}

解决方案 »

  1.   

    我在下载之前是一段用excel.dll生成文件的代码
      

  2.   

    CloseAllExcel();//结束EXCEL进程
    之后,垃圾回收程序不会立刻回收,而是当垃圾回收程序去收集资源时,才进行无用资源的回收估计是在程序调用 CloseAllExcel();// 这句之后,你的excel.dll 还在占用生成的文件
      

  3.   

    个人也是觉得CloseAllExcel这个是问题存在的原因
      

  4.   

    CloseAllExcel()并不是问题所在,这个方法是在出现这个问题以后加上去的 为了确保结束excel进程我也怀疑时仍然在占用,但是我前面用mySheet.Quit()结束了,而且如果是还在占有生成文件,为什么时好时坏,极度郁闷中……
      

  5.   

    生成文件代码如下
    Excel.Application myExcel=new Excel.ApplicationClass( );
    Excel.Workbook myBook = myExcel.Application.Workbooks.Open(StrFileName1,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
    myExcel.Visible=false;
    Excel.Worksheet mySheet=(Excel.Worksheet)myBook.Worksheets[1];
    int RowNum = 3;
    int ColumnNum = 4; mySheet.Cells[1,3] = TxtBeginData.Text.ToString();
    Excel.Range r;
    r = mySheet.get_Range(mySheet.Cells[RowNum,1],mySheet.Cells[RowNum,1]);
    while (r.Text.ToString() != "")
    {
    DataRow[] Dr = Tables.Select("cname='"+ r.Text.ToString().Trim() +"'");
    if (Dr.Length > 0)
    {
    for(int i=1;i<4;i++)
    mySheet.Cells[RowNum,ColumnNum + i] = Dr[0]["TimeValue" + i].ToString();
    }
    RowNum ++ ;
    r = mySheet.get_Range(mySheet.Cells[RowNum,1],mySheet.Cells[RowNum,1]);
    }
    myBook.SaveAs(StrFileName,missing,missing,missing,missing,missing,Excel.XlSaveAsAccessMode.xlNoChange,missing,missing,missing,missing);
    myBook = null;
    myExcel.Quit();
    myExcel = null;
      

  6.   

    我觉得,还是execl进程没有及时退出.
    exec仍然在占用着文件.
    你可能说你已经发出.quit().但是这只是通知clr,可以回收内存.
    但并不是说把进程kill了.
    所以可能存在一个时间差.
    你可以这么试试.
    1.先用一个按钮,执行生成.
    2.然后,中间间隔一点时间,再用一个按钮,来执行下载.
    3.如果以上没问题.应该就是clr没有及时回收内存,或说系统没有及时退出execl进程.
    时好时坏,cpu是执行的问题.可说系统分配的进程给cpu执行是有时间先后的,也就说是时间片.
    这不说了.一般情况下我们感觉是即时的,但是,特殊情况呢?
      

  7.   

    看了楼上的观点,觉得有道理,单步调试的时候可能就时因为一点时间使系统及时结束了进程。
    觉得奇怪的就是为什么会不能及时结束呢?我在生成文件结束后又加了强制结束EXCEL进程的代码。
      

  8.   

    虽然我也比较赞同lohoo(水喻舟)的观点,但是第一次会出错,重新打开页面再次下载就没有任何问题,这个问题却又让我感到有点怀疑。
      

  9.   

    楼主还是把StreamWriter把文件写入流,然后清空流和释放文件比较安全
      

  10.   

    楼上是指用流生成EXCEL文件??
      

  11.   

    单步调试也没有任何问题 --已经非常明显是时间差的问题了估计  myBook.SaveAs 写文件到磁盘需要点时间
    楼主可以试试:
    CloseAllExcel();
    Thread.sleep(100);
    Response.WriteFile( StrFileName );
      

  12.   

    楼上的方法早已试过,还是无效……
    不过仍然谢谢先
    暂时只好用FOR循环空语句来试验而且有个很奇怪的地方,每次当单步调试以后可以下载后,再次直接运行就可以了,但是过一段时间以后就又不行了
      

  13.   

    lz OpenFile()在哪调用的,有没有可能调用了二次,如Page_Load里调用了一次,事件处理时又调用一次