我正試圖對應用程序實施文件壓縮。該應用程序已經存在了一段時間,所以它需要能夠讀取以前版本編寫的未壓縮文檔。我期望DeflateStream能夠處理一個未壓縮的文件,但是對於GZipStream,我得到了「GZip頭部中的幻數不正確」錯誤。對於DeflateStream,我會得到「解碼時發現無效數據」。我想它沒有找到標記文件的標題爲它的類型。可以使用DeflateStream或GZipStream來壓縮未壓縮的文件嗎?
如果不可能簡單地處理一個未壓縮的文件,那麼第二好的方法是確定一個文件是否被壓縮,然後選擇讀取文件的方法。我發現這個鏈接:http://blog.somecreativity.com/2008/04/08/how-to-check-if-a-file-is-compressed-in-c/,但這是非常具體的實現,並不覺得正確的方法。它也可以提供誤報(我相信這很少見,但它確實表明這不是正確的做法)。
我考慮過的第三個選項是嘗試使用DeflateStream,如果發生異常,則回退到普通流IO。這也感覺混亂,並導致VS在異常中斷開(除非我解開異常,我不想這麼做)。
當然,我可能只是會以錯誤的方式去做。這是我在.Net 3.5中試過的代碼:
Stream reader = new FileStream(fileName, FileMode.Open, readOnly ? FileAccess.Read : FileAccess.ReadWrite, readOnly ? FileShare.ReadWrite : FileShare.Read);
using (DeflateStream decompressedStream = new DeflateStream(reader, CompressionMode.Decompress))
{
workspace = (Workspace)new XmlSerializer(typeof(Workspace)).Deserialize(decompressedStream);
if (readOnly)
{
reader.Close();
workspace.FilePath = fileName;
}
else
workspace.SetOpen(reader, fileName);
}
任何想法?
謝謝! 盧克。
如何使用不同的文件名或擴展名爲您的新文件格式? – Thilo 2010-09-09 10:24:29
我想這會起作用(作爲一個標誌),但寧願避免poss,以便最終用戶不必知道他們的文檔有多個文件擴展名。我也有興趣知道是否有人有其他解決方案,只是爲了知道這是否是.Net的限制,或者我是否做錯了什麼。雖然謝謝! – Luke 2010-09-09 10:31:11
「試圖確定」文件是否被壓縮(通過熵,檢查非ascii字符,無論如何)正在尋求麻煩。你*需要*一個正確的文件頭。壓縮整個文件意味着它不再是一個XML文檔(並且舊版本的應用程序會嘗試讀取它),所以沒有理由不能*添加標題:) – snemarch 2010-09-09 11:58:40