2011-06-01 29 views
1

時上傳同一文件的多個時間我收到此錯誤......文件上傳控制誤差,訪問被拒絕被另一個人

「該進程無法訪問該文件「d:\ MarketingSystem \ ExcelImport \ Sample.xls',因爲它正在被另一個進程使用。「

得到錯誤在這行

RevenueDumpFileUpload.PostedFile.SaveAs(Server.MapPath(strFilePathOnServer) + RevenueDumpFileUpload.FileName); 

這是我的全部代碼.....

protected void btnImport_Click(object sender, EventArgs e) 
{ 
    if (RevenueDumpFileUpload.HasFile) 
    { 

     string strFilePathOnServer = ConfigurationManager.AppSettings["RevenueDumpFileLocation"]; 
     String sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath(strFilePathOnServer) + RevenueDumpFileUpload.FileName + ";Extended Properties=Excel 8.0;"; 
     string strPostedFileName = RevenueDumpFileUpload.PostedFile.FileName; 
     if (strPostedFileName != string.Empty && RevenueDumpFileUpload.PostedFile.ContentLength != 0) 
     { 
      //Delete Old file before uploading new file. 
      if (System.IO.File.Exists(strFilePathOnServer)) 
      { 
       System.IO.File.Delete(strFilePathOnServer); 

      } 
      //Save-Upload File to server. 
      RevenueDumpFileUpload.PostedFile.SaveAs(Server.MapPath(strFilePathOnServer) + RevenueDumpFileUpload.FileName); 
      RevenueDumpFileUpload.FileContent.Dispose(); 
     } 
     OleDbConnection Exlcon = new OleDbConnection(sConnectionString); 
     try 
     { 
      Exlcon.Open(); 
     } 
     catch 
     { 
      return; 
     } 
     finally 
     { 
      RevenueDumpFileUpload.PostedFile.InputStream.Flush(); 
      RevenueDumpFileUpload.PostedFile.InputStream.Close(); 
     } 

     OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [Sheet1$]", Exlcon); 
     OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(); 
     objAdapter1.SelectCommand = objCmdSelect; 
     objAdapter1.Fill(objDataset1, "XLData"); 
     methodtosave(); 

    } 

} 

在我的Web配置文件:

<appSettings> 
<add key="RevenueDumpFileLocation" value="~/ExcelImport/"/> 

如何解決這個問題?

幫助我..

在此先感謝

回答

0

你忘傳遞File NameFile Extension當你試圖刪除的文件。

if (System.IO.File.Exists(Server.MapPath(strFilePathOnServer) + strPostedFileName+ 
    System.IO.Path.GetExtension(RevenueDumpFileUpload.FileName))) 
{ 
    System.IO.File.Delete(Server.MapPath(strFilePathOnServer) + strPostedFileName + 
    System.IO.Path.GetExtension(RevenueDumpFileUpload.FileName)); 
} 
+0

我得到的同樣的錯誤,當我用這個代碼.. – 2011-06-01 11:51:58

+0

它不會去if條件內 – 2011-06-01 11:53:36

+0

它應該,你可以嘗試我更新的答案?用路徑調試並檢查文件名。 – 2011-06-01 11:54:01

1

好吧,如果OleDbConnection的作用就像SqlConnection對象什麼,你有這條線:

Exlcon.Open(); 

這是打開連接,但你沒有一個匹配線收連接。這意味着Jet數據庫提供程序將繼續保持該文件處於打開狀態,直到連接對象被垃圾收集爲止。這將是更好的包裝這一行:

OleDbConnection Exlcon = new OleDbConnection(sConnectionString); 

在使用語句,其機身延伸的功能的其餘部分,讓你保證,它的關閉/處置。

接下來,您是否考慮過如果多個用戶同時上傳同名的文件會發生什麼情況 - 此方法將被破壞。在服務器上使用與用戶ID或會話ID相關的新文件名可能更好,並且在整個方法中包裝try/finally以確保文件在使用後被刪除。

以上可能是您當前問題的原因,如果這是生產中出現的錯誤 - 如果兩個人同時嘗試上傳,那麼他們的兩個請求可能會超過「如果存在則刪除「代碼的一部分,然後一個請求設法保存該文件並打開一個連接,然後在嘗試保存相同的文件名時另一個請求會翻轉。