压缩解压缩
核心庫NewLife.Core內置了壓縮相關功能擴展,并且獨立實現的ZipFile還支持.NET2.0和.NET4.0,該類在.NET4.5以后成為.NET Framework框架標配。
數據流壓縮
IOHelper類擴展了字節數組和數據流的壓縮擴展方法
Byte[] Compress(this Byte[] data); Byte[] Decompress(this Byte[] data); Stream Compress(this Stream inStream, Stream outStream = null); Stream Decompress(this Stream inStream, Stream outStream = null); Stream CompressGZip(this Stream inStream, Stream outStream = null); Stream DecompressGZip(this Stream inStream, Stream outStream = null);從.NET2.0開始,就內置了Deflate壓縮算法,這是很常見的一種數據壓縮算法,HTTP常用它進行壓縮,壓縮比一般,但是壓縮速度很好。上述字節數組和數據流的擴展就是對DeflateStream的簡單封裝,以兼容.NET2.0之上的所有應用(不同NFX版本的DeflateStream用法有所不同)。
而GZip則是一種數據格式,多了個頭部,數據體部分還是Deflate壓縮。因此,數據流壓縮直接用Deflate算法,而壓縮為文件時,則使用GZip,一般用gz后綴。
例如,XCode導出整表數據時,為了減小文件大小,會直接輸出到用GZipStream包裝的文件流。
文件壓縮
PathHelper類擴展了文件和目錄的壓縮及解壓縮。
void Extract(this FileInfo fi, String destDir, Boolean overwrite = false); void Compress(this FileInfo fi, String destFile); void Compress(this DirectoryInfo di, String destFile = null);Extract把壓縮文件解壓縮到目標目錄,支持覆蓋已存在文件。一般用于壓縮備份和數據恢復場合。
(注意:.zip后綴文件采用ZipFile類處理,其它后綴僅支持在Windows上調用7z處理,下同)
Compress把文件壓縮到目標文件,一般用于壓縮備份日志等文本文件,有很大的壓縮比。
Compress另一個重載,把目錄壓縮到目標文件,一般用于壓縮備份整個目錄,如配置文件目錄等。
ZipFile壓縮
Zip壓縮文件實現類ZipArchive,而ZipFile擴展了常用方法。
// 打開壓縮文檔 ZipArchive Open(String archiveFileName, ZipArchiveMode mode, Encoding entryNameEncoding = null); // 從目錄創建壓縮文檔 void CreateFromDirectory(String sourceDirectoryName, String destinationArchiveFileName, CompressionLevel compressionLevel, Boolean includeBaseDirectory);壓縮文件:
using var zip = ZipFile.Open(destFile, ZipArchiveMode.Create); zip.CreateEntryFromFile(fi.FullName, fi.Name, CompressionLevel.Optimal);解壓縮文件:
using var zip = ZipFile.Open(fi.FullName, ZipArchiveMode.Read, null); var di = Directory.CreateDirectory(destDir); var fullName = di.FullName; foreach (var item in zip.Entries) {var fullPath = Path.GetFullPath(Path.Combine(fullName, item.FullName));if (!fullPath.StartsWith(fullName, StringComparison.OrdinalIgnoreCase))throw new IOException("IO_ExtractingResultsInOutside");if (Path.GetFileName(fullPath).Length == 0){if (item.Length != 0L) throw new IOException("IO_DirectoryNameWithData");Directory.CreateDirectory(fullPath);}else{Directory.CreateDirectory(Path.GetDirectoryName(fullPath));try{item.ExtractToFile(fullPath, overwrite);}catch { }} }Zip文件本質上就是一個檔案數據庫,頭部有目錄,后面就是各個被壓縮文件的數據。通過擴展方法或者構造函數拿到ZipArchive后,直接CreateEntry就可以加入要壓縮的文件,或者遍歷Entries集合就得到內部每個被壓縮文件。
7z壓縮
SevenZip類用于對7z.exe進行包裝,在Windows上處理各種類型壓縮文件,它擁有極高的壓縮比,在某些維護性系統中具有無可比擬的優勢。
SevenZip首先在附近目錄查找7z.exe,然后在注冊表查找安裝路徑,實在找不到就從X組件資源站下載 http://x.newlifex.com/7z_v16.04.zip 。
總結
- 上一篇: VSCode+BeetleX.VueHo
- 下一篇: 分布式数字签名令牌TokenProvid