2010-01-13 44 views
3

我想保存一個XDcoument到沒有足夠的可用內存空間的拇指驅動器。 (這是應用程序的特殊測試條件)儘管應用程序正在給出如下的異常,但我無法在XDocument.Save(filePath)附近的try catch塊中獲取它。看起來像是延遲投擲。這是一個LINQ問題還是我做錯了什麼?內存異常,而XDocument.Save()

alt text http://img211.imageshack.us/img211/8324/exce.png

System.IO.IOException was unhandled 
Message="There is not enough space on the disk.\r\n" 
Source="mscorlib" 
StackTrace: 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) 
    at System.IO.FileStream.FlushWrite(Boolean calledFromFinalizer) 
    at System.IO.FileStream.Dispose(Boolean disposing) 
    at System.IO.FileStream.Finalize() 

回答

5

您在框架中發現了一個錯誤。 XDocument.Save(string)使用「using」語句確保輸出流被處置。它取決於您在處理指令中使用的編碼,但內部System.Xml.XmlUtf8RawTextReader是實現文本編寫器的常用編碼。

錯誤:編寫該類的Microsoft程序員忘記實現Dispose()方法。只有Close()方法被實現。

奇怪的是,這個bug還沒有在connect.microsoft.com反饋網站上報告。它應該在通用程序中造成麻煩,因爲該文件保持打開狀態,直到終結器線程運行。雖然這通常不會花費那麼長時間,幾秒鐘左右。除了在寫完後立即退出程序的情況,並且在不幸的運氣在磁盤空間不足的時候緩衝區被刷新。

解決此問題的方法是使用XDocument.Save(TextWriter)重載,而不是傳遞其編碼與XML編碼匹配的StreamWriter。

+0

嘿謝謝你的答案。在我的情況下,我有意讓我的拇指驅動器的空間少於我需要的空間,這是我正在檢查的測試條件。 – 2010-01-13 21:38:24

+1

那麼,這個錯誤的另一個副作用就是你無法彈出你的拇指驅動器。 – 2010-01-13 21:50:34

1

看堆棧跟蹤。該跟蹤以一個Finalize調用開始,該調用執行一個Dispose,該調用執行一個FlushWrite調用WriteCore,該調用獲取該錯誤。

換句話說,首先刷新你的數據。

發佈您用於編寫的代碼,我們可以告訴您在何處執行刷新。

0

偷看成反射器,最後幾行是

using (XmlWriter writer = XmlWriter.Create(fileName, xmlWriterSettings)) 
{ 
    this.Save(writer); 
} 

這意味着,作家被佈置在拋出異常。
我想,在調用Save之前檢查可用磁盤空間會更好。

編輯:你有沒有Dispose d的任何對象的XDocument實例依靠之前打電話給Save

+0

最後幾行是什麼?另外,這與堆棧跟蹤不一致。堆棧上不會有Finalize方法。 – 2010-01-13 20:37:51

+1

如果在執行檢查後另一個進程佔用了要用於進程的磁盤空間,則檢查磁盤空間不會節省您的時間。 – 2010-01-13 20:40:40

+0

@Erik:可能有幾種這樣的情況,如果有必要讓萬無一失的話:) OP可以看到你描述的場景是否是有效的案例。 – shahkalpesh 2010-01-13 20:59:20

0

XDocument.Save(string)沒有錯誤,它實現了Dispose方法。 using語句是: - 使用(XmlWriter writer = XmlWriter.Create(fileName, xmlWriterSettings)) this.Save(writer);

(也如上所述)

而且XmlWriter的確實有Dispose(),它實現IDisposable接口。