2014-01-15 75 views
0

我有一個關於我的Asp.Net應用程序的問題。我正在使用一個DataTable創建一個Excel文件。這裏是相關的功能:Asp.Net文件流IO異常:無法訪問文件,因爲進程正在被另一個進程使用

public static void ExportToExcel(System.Data.DataTable Tbl, string ExcelFilePath) 
     { 
      try 
      { 
       if (Tbl == null || Tbl.Columns.Count == 0) 
        throw new Exception("ExportToExcel: Null or empty input table!\n"); 

       // load excel, and create a new workbook 
       Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); 
       excelApp.Workbooks.Add(); 

       // single worksheet 
       Microsoft.Office.Interop.Excel._Worksheet workSheet = excelApp.ActiveSheet; 

       // column headings 
       for (int i = 0; i < Tbl.Columns.Count; i++) 
       { 
        workSheet.Cells[1, (i + 1)] = Tbl.Columns[i].ColumnName; 
       } 

       // rows 
       for (int i = 0; i < Tbl.Rows.Count; i++) 
       { 
        // to do: format datetime values before printing 
        for (int j = 0; j < Tbl.Columns.Count; j++) 
        { 
         workSheet.Cells[(i + 2), (j + 1)] = Tbl.Rows[i][j]; 
        } 
       } 

       // check fielpath 
       if (ExcelFilePath != null && ExcelFilePath != "") 
       { 
        try 
        { 
         workSheet.SaveAs(ExcelFilePath); 
         excelApp.Quit(); 
        } 
        catch (Exception ex) 
        { 
         throw new Exception("ExportToExcel: Excel file could not be saved! Check filepath.\n" 
          + ex.Message); 
        } 
       } 
       else // no filepath is given 
       { 
        excelApp.Visible = true; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("ExportToExcel: \n" + ex.Message); 
      } 
     } 

比我需要發送這個'新創建的'excel文件到用戶的計算機。用戶下載此文件。這裏是'下載功能':

public void FileDownload(string fileName) 
     { 
      Session["dosya"] = fileName; 
      string dosyaUrl = @Server.MapPath("/") + Session["dosya"].ToString() + ".xlsx"; //buradan sonra dosyamızı indirme işlemine başlıyoruz. 
      string yeni_dosya = Session["dosya"].ToString() + ".xlsx"; //biz işlem yapılacak dosyanın adını sessina attık oyle kullandık siz istediğiniz yolla yapabilirsiniz. 
      FileStream fs; 
      if (File.Exists(dosyaUrl)) 
      { 
       fs = new FileStream(dosyaUrl, FileMode.Open, FileAccess.Read, FileShare.Read); 
      } 
      else 
      { 
       return; 
      } 
      byte[] buffer = new byte[(int)fs.Length]; 
      fs.Read(buffer, 0, (int)fs.Length); 
      fs.Flush(); 
      fs.Close(); 
      fs.Dispose(); 
      Response.Clear(); 
      Response.AddHeader("Content-Length", buffer.Length.ToString());//içeriğin uzunluğu AddHeader fonksiyonuna gonderiliyor... 
      Response.AddHeader("Content-Disposition", "attachment; filename=" + yeni_dosya); 
      Response.BinaryWrite(buffer); 
      File.Delete(dosyaUrl); 
      Response.End(); 

     } 

而這兩個功能是由我的網頁上的按鈕控制。

當代碼行來

fs.Read(buffer, 0, (int)fs.Length); 

我得到異常的行:

IO異常是由用戶代碼未處理:因爲這個過程是被另一個無法訪問該文件過程

我不明白問題的原因。因爲我正在保存並關閉文件。在任務管理器上,我看不到有關Excel文件的任務。當我在函數行上獲得斷點並逐行執行代碼時,異常不會處理。

那麼會有什麼問題呢?

回答

相關問題