2008-09-16 32 views
2

我的web應用程序生成PDF文件並通過電子郵件或傳真將它們發送給我們的客戶。不知何故,IIS6保留了該文件,並阻止了任何其他請求聲明舊的'..該進程無法訪問該文件'xxx.pdf',因爲它正在被另一個進程使用。'IIS保留我生成的文件

當我回收應用程序池時,一切正常。有人知道爲什麼會發生這種情況,我該如何阻止它。

感謝

回答

6

正如大家說,不要叫CloseDispose方法在任何IO對象讀/寫的PDF文件時,你必須打開。

但我想你已經加入了一個第三方組件?爲你寫的PDF文件?如果出現這種情況,您可能需要與供應商和/或其文檔進行覈對,以確保您按照供應商希望的方式進行操作。不要相信從別人那裏得到的黑盒子,除非它已經證明了自己。

另一個看點可能是在對PDF文件的多個Web請求期間發生了什麼,您確定該文件不是從多個位置同時寫入的嗎?例如2-3請求同時創建PDF?或PDF生成過程中的2-3頁?

最後,您可能需要檢查異常日誌以確保沒有任何事件正在崩潰/線程退出,並且在您沒有注意到的情況下保持文件句柄處於打開狀態。在多線程場景中會發生很多事情,有時線程會崩潰並退出 - 這可能會發生,尤其是在您使用第三方組件時,它們可能會執行一些技巧,這是您永遠不會知道的。

0

我想看看你的代碼,並確保所有手柄打開(生成)文件已正確關閉。有時你不能依靠垃圾收集器來排序這些東西。

1

聽起來像,文件 - 在創建後 - 仍然被工作進程鎖定。確保關閉文件的所有連接。 (請記住,使用blocks'll照顧)

0

檢查磁盤上的所有代碼寫入文件是否正確關閉每個句柄,使用finally子句中的.Close()或通過「using」子句C#

byte[] asciiBytes = getPdf(...); 
try{ 
BinaryWriter bw = new BinaryWriter(File.Create(filename)); 
bw.Write(pdfBytes); 
} 
finally { 
    if(null != bw) 
    bw.Close(); 
} 

使用Response和內容處置條款的文件

Response.ContentType = "application/pdf"; 
Response.AppendHeader("Content-disposition", "attachment; filename=" + PDID + ".pdf"); 
Response.WriteFile(filename); 
Response.Flush(); 
發送

顯示的代碼創建和PDF文件從大約18個月發送給客戶,我們從來沒有見過一個文件鎖定。

0
  1. 和前面提到的一樣:注意關閉所有打開的處理程序。

  2. 有時Microsoft的索引服務會阻止文件。排除目錄