资 源 简 介
本程序是基于 sharpcompress-master 设计的演示程序。开原地址:https://github.com/adamhathcock/sharpcompress。1. 程序主要展示了压缩文件的解压缩,支持的文件类型有:rar、zip、7zip、Gzip、tar......等压缩格式,展示了密码解压、分卷解压、解压进度等功能。2. 不支持“带密码的分卷压缩文件”的解压;无密码分卷压缩、单个带密码文件正常解压。3. 此程序在设计中,对组件源代码进行了修改,与原组件代码对照查看。4、sharpcompress-master组件功能繁多,比如,文件压缩为图片、压缩文件内文件添加删除、更名等等,对照现有的压缩软件,功能均具备,可在代码中查看使用。本示例只是展示了解压缩功能。此程序为识别全部压缩格式,未引用DLL,全部为cs文件,如有错误,自行对照修正。private void Uncompress(string archiveFile, string destinationPath, string password = null) { var archive = ArchiveFactory.Open(archiveFile, new ReaderOptions() { Password = password, LeaveStreamOpen = true }); volumes = archive.Entries.Count(); archive.EntryExtractionBegin = archive_EntryExtractionBegin; archive.FilePartExtractionBegin = archive_FilePartExtractionBegin; archive.CompressedBytesRead = archive_CompressedBytesRead; Task.Run(() => { long order = 0; foreach (var entry in archive.Entries) { if (!entry.IsDirectory) { entry.WriteToDirectory(destinationPath, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true, }); } order ; this.CrossThreadCalls(() => { if (volumes > 1) { progress[0].Value = CreatePercentage(order, volumes); } }); } MessageBox.Show("解压缩任务完成 !"); }); } private void archive_EntryExtractionBegin(object sender, ArchiveExtractionEventArgs e) { entryTotal = e.Item.Size; info_builde1 = "提取文件: " e.Item.Key ";"; } private void archive_FilePartExtractionBegin(object sender, FilePartExtractionBeginEventArgs e) { partTotal = e.Size; info_builde2 = "分卷:" e.Name ";"; } private void archive_CompressedBytesRead(object sender, CompressedBytesReadEventArgs e) { string percentage = entryTotal.HasValue ? CreatePercentage(e.CompressedBytesRead, entryTotal.Value).ToString() : "Unknown"; info_builde = info_builde1 info_builde2 "字节:" e.CompressedBytesRead ";百分比:" percentage "%"; this.CrossThreadCalls(() => { compress_Info.Text = info_builde; progress[1].Value = int.Parse(percentage) > 100 || int.Parse(percentage) < 0 ? 100 : int.Parse(percentage); if (volumes < 2) progress[0].Value = progress[1].Value; Application.DoEvents(); }); } private int CreatePercentage(long n, long d) { return (int)(((double)n / (double)d) * 100); }