[英]c# create 7z archive, then Can not open file “name.7z” as an archive
[英]How to decompress a 7z archive with C# .NET 3.5?
我希望我的應用程序使用 .7z 文件中的文件。
我找到了一些關於如何解壓縮 7z 文件的解釋。 然而,它們都是關於一個我在野外還沒有遇到過的案例:一個解壓為單個文件的存檔。 我希望 .7z 存檔解壓縮為任意數量的文件,可能位於任意子文件夾中。
似乎可以通過包含整個 7zip 應用程序然后在進程中運行它來做到這一點。 但是,考慮到有官方 LZMA SDK ,這似乎是不必要的額外步驟。 此外,它會導致有關交叉兼容性的問題。
那么,如何使用 C# (.NET 3.5) 將 .7z 存檔解壓縮到給定文件夾中?
“請出示無效的代碼。 ”
好吧,目前我正在另一個問題上使用這個答案的后半部分。 但是,我希望不要做我想做的事情 - output
(就像input
一樣)是一個FileStream
,所以很明顯這只會創建一個文件。
它表明Decoder
是進行解壓縮的類,但它沒有一個方法可以與例如DirectoryInfo
、 string
路徑或類似的東西一起使用 - 它都是一個文件輸入,一個文件輸出。 我在使用 SDK 時發現的每個信息都做同樣的事情; 我還沒有找到一個將存檔提取到多個文件的方法。
我得出以下結論:
將 .7z 存檔解壓縮到文件夾中不是 C# LZMA SDK 提供的功能。
恐怕我還沒有找到任何確鑿的證據,就像博客文章直接陳述的那樣。
但是,我找到了.7z
文件格式的說明。 這個描述沒有提供足夠的技術細節來制定一個有效的解決方案,但它包含了關於格式的某些事實:
在本節中,我將解釋前面的示例如何存儲在數據結構化 [...]
首先是 Header 它只包含兩個變量: FileInfo 和 StreamsInfo。
FileInfo 可能是最容易理解的結構。 它包含 7z 中每個文件的名稱和一些其他標志,用於定義文件實際上是目錄還是文件是空文件。
據我所知,這種結構並沒有反映在 C# SDK 的代碼中。 結合Decoder.Code()
方法不適用於目錄路徑或多個輸出Stream
是一個強有力的指標。
因此,LZMA SDK 的 C# 部分似乎只處理單個文件的加密和解密,或在鏈接文檔中稱為“壓縮流”。 .7z
存檔格式然后算作一個單獨的格式,它最終是一個包含任意數量壓縮流的結構。
這些流實際上可以以任意方式組合; 例如,存檔可以包含用 LZMA 壓縮的文件 A 和 B,然后將文件 C 添加到混合中並使用另一種算法再次壓縮它。 這使得解壓縮.7z
存檔變得更加復雜,這使得 SDK 中沒有提供此功能更加遺憾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.