簡體   English   中英

如何使用 C# .NET 3.5 解壓縮 7z 存檔?

[英]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是進行解壓縮的類,但它沒有一個方法可以與例如DirectoryInfostring路徑或類似的東西一起使用 - 它都是一個文件輸入,一個文件輸出 我在使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM