C#压缩/解压缩7-zip文件

 

7-Zip 简介

 

7-Zip 是一款号称有着现今最高压缩比的压缩软件,它不仅支持独有的 7z 文件格式,而且还支持各种其它压缩文件格式,其中包括 ZIP, RAR, CAB, GZIP, BZIP2和 TAR 等等。此软件压缩的压缩比要比普通 ZIP 文件高 30-50% ,因此,它可以把 Zip 格式的文件再压缩 2-10% 。
7-Zip 主要特征
更新了算法来加大 7z 格式 的压缩比
支持格式:
压缩及解压缩:7z、ZIP、GZIP、BZIP2 和 TAR
仅解压缩:RAR、CAB、ISO、ARJ、LZH、CHM、WIM、Z、CPIO、RPM、DEB 和 NSIS
对于 ZIP 及 GZIP 格式,7-Zip 能提供比使用 PKZip 及 WinZip 高 2-10% 的压缩比
7z 格式支持创建自释放(SFX)压缩档案
集成 Windows 外壳扩展
强大的的文件管理
强大的命令行版本
支持 FAR Manager 插件
支持 69 种语言

 

C#中压缩/解压缩7-zip文件的方法

 

 1.控制台方式调用7z.exe文件

           Process process = new Process();
           process.StartInfo.FileName = @"XXX\7z.exe";
           解压:(o与F要连在一起,解压时,会生成2这个文件夹)
   process.StartInfo.Arguments = @" e F:\2.zip -oF:\1";
   压缩:(把1里的所有文件压缩成2.zip
process.StartInfo.Arguments = @" a -tzip -r F:\2.zip F:\1 ";

           process.Start();

 <----------------------以下待研究------------------------------>

2.根据压缩算法LZMA SDK

LZMA SDK里面包括了压缩和解压缩算法的C#源码(当前版本是4.65)
下载地址: http://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/4.65/lzma465.tar.bz2/download
 
3.在.NET应用程序中使用7-Zip的压缩/解压缩功能(作者 Abel Avram 译者 赵劼 )
开发人员Eugene Sichkar创建了一系列7-Zip动态链接库的C#接口,.NET应用程序中使用7-Zip的压缩/解压缩功能了。
据Eugene称,该项目实现了以下接口:
  • IProgress - 基本进度的回调
  • IArchiveOpenCallback - 打开压缩包的回调
  • ICryptoGetTextPassword - 为压缩提示密码的回调
  • IArchiveExtractCallback - 对压缩包进行解压的回调
  • IArchiveOpenVolumeCallback - 打开额外压缩卷的回调
  • ISequentialInStream - 基本的只读数据流接口
  • ISequentialOutStream - 基本的只写数据流的接口
  • IInStream - 可以随机读取的输入数据流接口
  • IOutStream - 输出数据流接口
  • IInArchive - 主要压缩接口
具体的使用方式可以参考源码中示例.
4.SevenZipSharp 

markhor 创建了SevenZipSharp 项目,SevenZipSharp 是开源的,里面实现了自解压和压缩所有7-ZIP支持的格式.它改进了7-Zip动态链接库的C#接口的一些方法.

常用压缩/解压缩示例(引自SevenZipSharp示例文件):

解压缩文件

using (SevenZipExtractor tmp = new SevenZipExtractor(@"d:\Temp\7z465_extra.7z")) 
{                
     for (int i = 0; i < tmp.ArchiveFileData.Count; i++) 
     { 
        tmp.ExtractFiles(@"d:\temp\!Пусто\", tmp.ArchiveFileData[i].Index); 
     } 
     //tmp.ExtractFiles(@"d:\temp\!Пусто\", 1, 3, 5); 
}

分卷压缩

SevenZipExtractor.SetLibraryPath(@"d:\Work\Misc\7zip\9.04\CPP\7zip\Bundles\Format7zF\7z.dll"); 
using (SevenZipExtractor tmp = new SevenZipExtractor(@"d:\Temp\SevenZip.7z.001")) 
{                 
    tmp.ExtractArchive(@"d:\Temp\!Пусто"); 
}

 

 压缩文件

SevenZipCompressor tmp = new SevenZipCompressor();             
tmp.CompressFiles(@"d:\Temp\arch.7z", @"d:\Temp\log.txt"); 
tmp.CompressDirectory(@"c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\1033", @"D:\Temp\arch.7z");

 

 

压缩ZIP文件

 

SevenZipCompressor tmp = new SevenZipCompressor(); 
tmp.ArchiveFormat = OutArchiveFormat.Zip; 
tmp.CompressFiles(@"d:\Temp\arch.zip", @"d:\Temp\gpl.txt", @"d:\Temp\ru_office.txt");

 

多线程解压缩

Thread t1 = new Thread(() => 
{ 
    using (SevenZipExtractor tmp = new SevenZipExtractor(@"D:\Temp\7z465_extra.7z")) 
    { 
        tmp.FileExtractionStarted += new EventHandler<FileInfoEventArgs>((s, e) => 
        { 
            Console.WriteLine(String.Format("[{0}%] {1}", 
                e.PercentDone, e.FileInfo.FileName)); 
        }); 
        tmp.ExtractionFinished += new EventHandler((s, e) => { Console.WriteLine("Finished!"); }); 
        tmp.ExtractArchive(@"D:\Temp\t1"); 
    } 
}); 

 

Thread t2 = new Thread(() => 
{ 
    using (SevenZipExtractor tmp = new SevenZipExtractor(@"D:\Temp\7z465_extra.7z")) 
    { 
        tmp.FileExtractionStarted += new EventHandler<FileInfoEventArgs>((s, e) => 
        { 
            Console.WriteLine(String.Format("[{0}%] {1}", 
                e.PercentDone, e.FileInfo.FileName)); 
        }); 
        tmp.ExtractionFinished += new EventHandler((s, e) => { Console.WriteLine("Finished!"); }); 
        tmp.ExtractArchive(@"D:\Temp\t2"); 
    } 
}); 

 

t1.Start(); 
t2.Start(); 
t1.Join(); 
t2.Join();

 

 

多线程压缩

Thread t1 = new Thread(() => 
{ 
    SevenZipCompressor tmp = new SevenZipCompressor();              
    tmp.FileCompressionStarted += new EventHandler<FileNameEventArgs>((s, e) => 
    { 
        Console.WriteLine(String.Format("[{0}%] {1}", 
            e.PercentDone, e.FileName)); 
    }); 
    tmp.CompressDirectory(@"D:\Temp\t1", @"D:\Temp\arch1.7z"); 

});

 

Thread t2 = new Thread(() => 
{ 
    SevenZipCompressor tmp = new SevenZipCompressor(); 
    tmp.FileCompressionStarted += new EventHandler<FileNameEventArgs>((s, e) => 
    { 
        Console.WriteLine(String.Format("[{0}%] {1}", 
            e.PercentDone, e.FileName)); 
    }); 
    tmp.CompressDirectory(@"D:\Temp\t2", @"D:\Temp\arch2.7z"); 
}); 
t1.Start(); 
t2.Start(); 
t1.Join(); 
t2.Join();   

转载于:https://www.cnblogs.com/Alvin-x/p/3466150.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于大文件的流式压缩和加解密,我可以给你一些思路和建议: 1. 压缩:可以使用压缩算法如GZIP、ZIP等对大文件进行流式压缩。在C#中,可以使用System.IO.Compression命名空间提供的GZipStream和ZipArchive类来实现。 示例代码: ```csharp using (var sourceStream = File.OpenRead(sourceFilePath)) { using (var targetStream = File.Create(targetFilePath)) { using (var gzipStream = new GZipStream(targetStream, CompressionMode.Compress)) { sourceStream.CopyTo(gzipStream); } } } ``` 2. 解压:对于经过压缩的大文件,同样可以使用GZipStream或ZipArchive类进行流式解压缩。 示例代码: ```csharp using (var sourceStream = File.OpenRead(sourceFilePath)) { using (var targetStream = File.Create(targetFilePath)) { using (var gzipStream = new GZipStream(sourceStream, CompressionMode.Decompress)) { gzipStream.CopyTo(targetStream); } } } ``` 3. 加密:对于大文件的加密,可以使用加密算法如AES、DES等对大文件进行分块加密,以保证加密效率和安全性。在C#中,可以使用System.Security.Cryptography命名空间提供的加密类来实现。 示例代码: ```csharp using (var sourceStream = File.OpenRead(sourceFilePath)) { using (var targetStream = File.Create(targetFilePath)) { using (var aes = Aes.Create()) { // 设置加密密钥和向量 aes.Key = key; aes.IV = iv; // 创建加密流 using (var encryptor = aes.CreateEncryptor()) { using (var cryptoStream = new CryptoStream(targetStream, encryptor, CryptoStreamMode.Write)) { sourceStream.CopyTo(cryptoStream); } } } } } ``` 4. 解密:对于经过加密的大文件,同样可以使用加密类进行分块解密。 示例代码: ```csharp using (var sourceStream = File.OpenRead(sourceFilePath)) { using (var targetStream = File.Create(targetFilePath)) { using (var aes = Aes.Create()) { // 设置解密密钥和向量 aes.Key = key; aes.IV = iv; // 创建解密流 using (var decryptor = aes.CreateDecryptor()) { using (var cryptoStream = new CryptoStream(sourceStream, decryptor, CryptoStreamMode.Read)) { cryptoStream.CopyTo(targetStream); } } } } } ``` 需要注意的是,在进行大文件的流式处理时,应该尽量避免将整个文件读取到内存中,而是采用分块读取的方式,以减少内存占用和提高处理效率。同时,在进行加解密操作时,应该谨慎处理加密密钥和向量,以保证数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值