前言
最近收到一個 Crystal Report 匯出 PDF 檔案,然後給 Client 下載。
平常運作都正常,最近才出現 System.IO.IOException: 檔案存在。的錯誤。
詳細錯誤訊息如下,
於 System.IO.**Error.WinIOError(Int32 errorCode, String maybeFullPath)
於 System.IO.**Error.WinIOError()
於 System.IO.Path.InternalGetTempFileName(Boolean checkHost)
於 System.IO.Path.GetTempFileName()
於 CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)
於 CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext)
於 CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportOptions options)
於 CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToHttpResponse(ExportOptions options, HttpResponse response, Boolean asAttachment, String attachmentName)
於 CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToHttpResponse(ExportFormatType formatType, HttpResponse response, Boolean asAttachment, String attachmentName)
於 CRViewer.ExportPDF(String RptName)
解法
Crystal Report 的程式碼蠻簡單的,如下,
1 | this.Response.ContentType = "application/pdf"; |
System.IO.Path.GetTempFileName()
應該是不會發生錯誤呀~
除非是權限不足。
但… 之前卻是可以的… 於是再 Search 看看有沒有相似的錯誤…
結果真的找到 Crystal Report - File Exists Error 感覺是一樣的問題。
This exception is documented in .NET and is raised when the temp directory reaches the limit of 65535 files.
這個問題是因為 Temp 目錄達到限制的 65,535 個檔案所引發的錯誤。
在 Path.GetTempFileName 方法 有說明
如果方法用來建立超過 65535 個檔案,而不刪除先前的暫存檔案,則 GetTempFileName 此方法會引發 IOException
再來就是檢查 Temp 目錄中是否真的超出 65,535 個檔案,
結果同事回答是 65,734 個,
所以就請同事將檔案刪少於 65,535 再試試看,就沒有問題了。
註: Temp 目錄的路徑是 環境變數 ,系統變數(S) 中的 TEMP 的設定值(檔案總管中,在”本機”上按右鍵,選”內容”,在右邊”關於”下方,點選”進階系統設定”)
參考資源
System.IO.IOException: The file exists
Crystal Report - File Exists Error
Path.GetTempFileName 方法