From 9dcf384263d2be8524fab29e9fb8aa9b33694808 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 7 Jan 2026 15:30:26 +0000 Subject: [PATCH 1/3] update for progress reporting --- USAGE.md | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/USAGE.md b/USAGE.md index 1e3a6c78..1c7b0e12 100644 --- a/USAGE.md +++ b/USAGE.md @@ -113,37 +113,28 @@ using (var archive = RarArchive.Open("Test.rar")) } ``` -### Extract solid Rar or 7Zip archives with manual progress reporting +### Extract solid Rar or 7Zip archives with progress reporting `ExtractAllEntries` only works for solid archives (Rar) or 7Zip archives. For optimal performance with these archive types, use this method: ```C# -using (var archive = RarArchive.Open("archive.rar")) // Must be solid Rar or 7Zip +using SharpCompress.Common; +using SharpCompress.Readers; + +var progress = new Progress(report => +{ + Console.WriteLine($"Extracting {report.EntryPath}: {report.PercentComplete}%"); +}); + +using (var archive = RarArchive.Open("archive.rar", new ReaderOptions { Progress = progress })) // Must be solid Rar or 7Zip { if (archive.IsSolid || archive.Type == ArchiveType.SevenZip) { - // Calculate total size for progress reporting - double totalSize = archive.Entries.Where(e => !e.IsDirectory).Sum(e => e.Size); - long completed = 0; - - using (var reader = archive.ExtractAllEntries()) + archive.WriteToDirectory(@"D:\output", new ExtractionOptions() { - while (reader.MoveToNextEntry()) - { - if (!reader.Entry.IsDirectory) - { - reader.WriteEntryToDirectory(@"D:\output", new ExtractionOptions() - { - ExtractFullPath = true, - Overwrite = true - }); - - completed += reader.Entry.Size; - double progress = completed / totalSize; - Console.WriteLine($"Progress: {progress:P}"); - } - } - } + ExtractFullPath = true, + Overwrite = true + }); } } ``` From 87ccbf329ddea249b9169c8083218747bfb04d90 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 7 Jan 2026 15:56:38 +0000 Subject: [PATCH 2/3] moved examples to USAGE --- README.md | 78 +------------------------------------------------------ 1 file changed, 1 insertion(+), 77 deletions(-) diff --git a/README.md b/README.md index 172003c1..bd737fb6 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ SharpCompress is a compression library in pure C# for .NET Framework 4.8, .NET 8 The major feature is support for non-seekable streams so large files can be processed on the fly (i.e. download stream). -**NEW:** All I/O operations now support async/await for improved performance and scalability. See the [Async Usage](#async-usage) section below. +**NEW:** All I/O operations now support async/await for improved performance and scalability. See the [USAGE.md](USAGE.md#async-examples) for examples. GitHub Actions Build - [![SharpCompress](https://github.com/adamhathcock/sharpcompress/actions/workflows/dotnetcore.yml/badge.svg)](https://github.com/adamhathcock/sharpcompress/actions/workflows/dotnetcore.yml) @@ -34,82 +34,6 @@ Hi everyone. I hope you're using SharpCompress and finding it useful. Please giv Please do not email me directly to ask for help. If you think there is a real issue, please report it here. -## Async Usage - -SharpCompress now provides full async/await support for all I/O operations, allowing for better performance and scalability in modern applications. - -### Async Reading Examples - -Extract entries asynchronously: -```csharp -using (Stream stream = File.OpenRead("archive.zip")) -using (var reader = ReaderFactory.Open(stream)) -{ - while (reader.MoveToNextEntry()) - { - if (!reader.Entry.IsDirectory) - { - // Async extraction - await reader.WriteEntryToDirectoryAsync( - @"C:\temp", - new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }, - cancellationToken - ); - } - } -} -``` - -Extract all entries to directory asynchronously: -```csharp -using (Stream stream = File.OpenRead("archive.tar.gz")) -using (var reader = ReaderFactory.Open(stream)) -{ - await reader.WriteAllToDirectoryAsync( - @"C:\temp", - new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }, - cancellationToken - ); -} -``` - -Open entry stream asynchronously: -```csharp -using (var archive = ZipArchive.Open("archive.zip")) -{ - foreach (var entry in archive.Entries.Where(e => !e.IsDirectory)) - { - using (var entryStream = await entry.OpenEntryStreamAsync(cancellationToken)) - { - // Process stream asynchronously - await entryStream.CopyToAsync(outputStream, cancellationToken); - } - } -} -``` - -### Async Writing Examples - -Write files asynchronously: -```csharp -using (Stream stream = File.OpenWrite("output.zip")) -using (var writer = WriterFactory.Open(stream, ArchiveType.Zip, CompressionType.Deflate)) -{ - await writer.WriteAsync("file1.txt", fileStream, DateTime.Now, cancellationToken); -} -``` - -Write all files from directory asynchronously: -```csharp -using (Stream stream = File.OpenWrite("output.tar.gz")) -using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, new WriterOptions(CompressionType.GZip))) -{ - await writer.WriteAllAsync(@"D:\files", "*", SearchOption.AllDirectories, cancellationToken); -} -``` - -All async methods support `CancellationToken` for graceful cancellation of long-running operations. - ## Want to contribute? I'm always looking for help or ideas. Please submit code or email with ideas. Unfortunately, just letting me know you'd like to help is not enough because I really have no overall plan of what needs to be done. I'll definitely accept code submissions and add you as a member of the project! From e038aea694af7797fad0094d7fc314e8eefc3faa Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 7 Jan 2026 16:10:55 +0000 Subject: [PATCH 3/3] move old changelog --- OLD_CHANGELOG.md | 142 +++++++++++++++++++++++++++++++++++++++++++ README.md | 152 +---------------------------------------------- 2 files changed, 144 insertions(+), 150 deletions(-) create mode 100644 OLD_CHANGELOG.md diff --git a/OLD_CHANGELOG.md b/OLD_CHANGELOG.md new file mode 100644 index 00000000..fbbdd7ae --- /dev/null +++ b/OLD_CHANGELOG.md @@ -0,0 +1,142 @@ + +# Version Log + +* [Releases](https://github.com/adamhathcock/sharpcompress/releases) + +## Version 0.18 + +* [Now on Github releases](https://github.com/adamhathcock/sharpcompress/releases/tag/0.18) + +## Version 0.17.1 + +* Fix - [Bug Fix for .NET Core on Windows](https://github.com/adamhathcock/sharpcompress/pull/257) + +## Version 0.17.0 + +* New - Full LZip support! Can read and write LZip files and Tars inside LZip files. [Make LZip a first class citizen. #241](https://github.com/adamhathcock/sharpcompress/issues/241) +* New - XZ read support! Can read XZ files and Tars inside XZ files. [XZ in SharpCompress #91](https://github.com/adamhathcock/sharpcompress/issues/94) +* Fix - [Regression - zip file writing on seekable streams always assumed stream start was 0. Introduced with Zip64 writing.](https://github.com/adamhathcock/sharpcompress/issues/244) +* Fix - [Zip files with post-data descriptors can be properly skipped via decompression](https://github.com/adamhathcock/sharpcompress/issues/162) + +## Version 0.16.2 + +* Fix [.NET 3.5 should support files and cryptography (was a regression from 0.16.0)](https://github.com/adamhathcock/sharpcompress/pull/251) +* Fix [Zip per entry compression customization wrote the wrong method into the zip archive](https://github.com/adamhathcock/sharpcompress/pull/249) + +## Version 0.16.1 + +* Fix [Preserve compression method when getting a compressed stream](https://github.com/adamhathcock/sharpcompress/pull/235) +* Fix [RAR entry key normalization fix](https://github.com/adamhathcock/sharpcompress/issues/201) + +## Version 0.16.0 + +* Breaking - [Progress Event Tracking rethink](https://github.com/adamhathcock/sharpcompress/pull/226) +* Update to VS2017 - [VS2017](https://github.com/adamhathcock/sharpcompress/pull/231) - Framework targets have been changed. +* New - [Add Zip64 writing](https://github.com/adamhathcock/sharpcompress/pull/211) +* [Fix invalid/mismatching Zip version flags.](https://github.com/adamhathcock/sharpcompress/issues/164) - This allows nuget/System.IO.Packaging to read zip files generated by SharpCompress +* [Fix 7Zip directory hiding](https://github.com/adamhathcock/sharpcompress/pull/215/files) +* [Verify RAR CRC headers](https://github.com/adamhathcock/sharpcompress/pull/220) + +## Version 0.15.2 + +* [Fix invalid headers](https://github.com/adamhathcock/sharpcompress/pull/210) - fixes an issue creating large-ish zip archives that was introduced with zip64 reading. + +## Version 0.15.1 + +* [Zip64 extending information and ZipReader](https://github.com/adamhathcock/sharpcompress/pull/206) + +## Version 0.15.0 + +* [Add zip64 support for ZipArchive extraction](https://github.com/adamhathcock/sharpcompress/pull/205) + +## Version 0.14.1 + +* [.NET Assemblies aren't strong named](https://github.com/adamhathcock/sharpcompress/issues/158) +* [Pkware encryption for Zip files didn't allow for multiple reads of an entry](https://github.com/adamhathcock/sharpcompress/issues/197) +* [GZip Entry couldn't be read multiple times](https://github.com/adamhathcock/sharpcompress/issues/198) + +## Version 0.14.0 + +* [Support for LZip reading in for Tars](https://github.com/adamhathcock/sharpcompress/pull/191) + +## Version 0.13.1 + +* [Fix null password on ReaderFactory. Fix null options on SevenZipArchive](https://github.com/adamhathcock/sharpcompress/pull/188) +* [Make PpmdProperties lazy to avoid unnecessary allocations.](https://github.com/adamhathcock/sharpcompress/pull/185) + +## Version 0.13.0 + +* Breaking change: Big refactor of Options on API. +* 7Zip supports Deflate + +## Version 0.12.4 + +* Forward only zip issue fix https://github.com/adamhathcock/sharpcompress/issues/160 +* Try to fix frameworks again by copying targets from JSON.NET + +## Version 0.12.3 + +* 7Zip fixes https://github.com/adamhathcock/sharpcompress/issues/73 +* Maybe all profiles will work with project.json now + +## Version 0.12.2 + +* Support Profile 259 again + +## Version 0.12.1 + +* Support Silverlight 5 + +## Version 0.12.0 + +* .NET Core RTM! +* Bug fix for Tar long paths + +## Version 0.11.6 + +* Bug fix for global header in Tar +* Writers now have a leaveOpen `bool` overload. They won't close streams if not-requested to. + +## Version 0.11.5 + +* Bug fix in Skip method + +## Version 0.11.4 + +* SharpCompress is now endian neutral (matters for Mono platforms) +* Fix for Inflate (need to change implementation) +* Fixes for RAR detection + +## Version 0.11.1 + +* Added Cancel on IReader +* Removed .NET 2.0 support and LinqBridge dependency + +## Version 0.11 + +* Been over a year, contains mainly fixes from contributors! +* Possible breaking change: ArchiveEncoding is UTF8 by default now. +* TAR supports writing long names using longlink +* RAR Protect Header added + +## Version 0.10.3 + +* Finally fixed Disposal issue when creating a new archive with the Archive API + +## Version 0.10.2 + +* Fixed Rar Header reading for invalid extended time headers. +* Windows Store assembly is now strong named +* Known issues with Long Tar names being worked on +* Updated to VS2013 +* Portable targets SL5 and Windows Phone 8 (up from SL4 and WP7) + +## Version 0.10.1 + +* Fixed 7Zip extraction performance problem + +## Version 0.10: + +* Added support for RAR Decryption (thanks to https://github.com/hrasyid) +* Embedded some BouncyCastle crypto classes to allow RAR Decryption and Winzip AES Decryption in Portable and Windows Store DLLs +* Built in Release (I think) diff --git a/README.md b/README.md index bd737fb6..73813f68 100644 --- a/README.md +++ b/README.md @@ -34,159 +34,11 @@ Hi everyone. I hope you're using SharpCompress and finding it useful. Please giv Please do not email me directly to ask for help. If you think there is a real issue, please report it here. -## Want to contribute? +zt#z# Want to contribute? I'm always looking for help or ideas. Please submit code or email with ideas. Unfortunately, just letting me know you'd like to help is not enough because I really have no overall plan of what needs to be done. I'll definitely accept code submissions and add you as a member of the project! -## TODOs (always lots) - -* RAR 5 decryption crc check support -* 7Zip writing -* Zip64 (Need writing and extend Reading) -* Multi-volume Zip support. -* ZStandard writing - -## Version Log - -* [Releases](https://github.com/adamhathcock/sharpcompress/releases) - -### Version 0.18 - -* [Now on Github releases](https://github.com/adamhathcock/sharpcompress/releases/tag/0.18) - -### Version 0.17.1 - -* Fix - [Bug Fix for .NET Core on Windows](https://github.com/adamhathcock/sharpcompress/pull/257) - -### Version 0.17.0 - -* New - Full LZip support! Can read and write LZip files and Tars inside LZip files. [Make LZip a first class citizen. #241](https://github.com/adamhathcock/sharpcompress/issues/241) -* New - XZ read support! Can read XZ files and Tars inside XZ files. [XZ in SharpCompress #91](https://github.com/adamhathcock/sharpcompress/issues/94) -* Fix - [Regression - zip file writing on seekable streams always assumed stream start was 0. Introduced with Zip64 writing.](https://github.com/adamhathcock/sharpcompress/issues/244) -* Fix - [Zip files with post-data descriptors can be properly skipped via decompression](https://github.com/adamhathcock/sharpcompress/issues/162) - -### Version 0.16.2 - -* Fix [.NET 3.5 should support files and cryptography (was a regression from 0.16.0)](https://github.com/adamhathcock/sharpcompress/pull/251) -* Fix [Zip per entry compression customization wrote the wrong method into the zip archive](https://github.com/adamhathcock/sharpcompress/pull/249) - -### Version 0.16.1 - -* Fix [Preserve compression method when getting a compressed stream](https://github.com/adamhathcock/sharpcompress/pull/235) -* Fix [RAR entry key normalization fix](https://github.com/adamhathcock/sharpcompress/issues/201) - -### Version 0.16.0 - -* Breaking - [Progress Event Tracking rethink](https://github.com/adamhathcock/sharpcompress/pull/226) -* Update to VS2017 - [VS2017](https://github.com/adamhathcock/sharpcompress/pull/231) - Framework targets have been changed. -* New - [Add Zip64 writing](https://github.com/adamhathcock/sharpcompress/pull/211) -* [Fix invalid/mismatching Zip version flags.](https://github.com/adamhathcock/sharpcompress/issues/164) - This allows nuget/System.IO.Packaging to read zip files generated by SharpCompress -* [Fix 7Zip directory hiding](https://github.com/adamhathcock/sharpcompress/pull/215/files) -* [Verify RAR CRC headers](https://github.com/adamhathcock/sharpcompress/pull/220) - -### Version 0.15.2 - -* [Fix invalid headers](https://github.com/adamhathcock/sharpcompress/pull/210) - fixes an issue creating large-ish zip archives that was introduced with zip64 reading. - -### Version 0.15.1 - -* [Zip64 extending information and ZipReader](https://github.com/adamhathcock/sharpcompress/pull/206) - -### Version 0.15.0 - -* [Add zip64 support for ZipArchive extraction](https://github.com/adamhathcock/sharpcompress/pull/205) - -### Version 0.14.1 - -* [.NET Assemblies aren't strong named](https://github.com/adamhathcock/sharpcompress/issues/158) -* [Pkware encryption for Zip files didn't allow for multiple reads of an entry](https://github.com/adamhathcock/sharpcompress/issues/197) -* [GZip Entry couldn't be read multiple times](https://github.com/adamhathcock/sharpcompress/issues/198) - -### Version 0.14.0 - -* [Support for LZip reading in for Tars](https://github.com/adamhathcock/sharpcompress/pull/191) - -### Version 0.13.1 - -* [Fix null password on ReaderFactory. Fix null options on SevenZipArchive](https://github.com/adamhathcock/sharpcompress/pull/188) -* [Make PpmdProperties lazy to avoid unnecessary allocations.](https://github.com/adamhathcock/sharpcompress/pull/185) - -### Version 0.13.0 - -* Breaking change: Big refactor of Options on API. -* 7Zip supports Deflate - -### Version 0.12.4 - -* Forward only zip issue fix https://github.com/adamhathcock/sharpcompress/issues/160 -* Try to fix frameworks again by copying targets from JSON.NET - -### Version 0.12.3 - -* 7Zip fixes https://github.com/adamhathcock/sharpcompress/issues/73 -* Maybe all profiles will work with project.json now - -### Version 0.12.2 - -* Support Profile 259 again - -### Version 0.12.1 - -* Support Silverlight 5 - -### Version 0.12.0 - -* .NET Core RTM! -* Bug fix for Tar long paths - -### Version 0.11.6 - -* Bug fix for global header in Tar -* Writers now have a leaveOpen `bool` overload. They won't close streams if not-requested to. - -### Version 0.11.5 - -* Bug fix in Skip method - -### Version 0.11.4 - -* SharpCompress is now endian neutral (matters for Mono platforms) -* Fix for Inflate (need to change implementation) -* Fixes for RAR detection - -### Version 0.11.1 - -* Added Cancel on IReader -* Removed .NET 2.0 support and LinqBridge dependency - -### Version 0.11 - -* Been over a year, contains mainly fixes from contributors! -* Possible breaking change: ArchiveEncoding is UTF8 by default now. -* TAR supports writing long names using longlink -* RAR Protect Header added - -### Version 0.10.3 - -* Finally fixed Disposal issue when creating a new archive with the Archive API - -### Version 0.10.2 - -* Fixed Rar Header reading for invalid extended time headers. -* Windows Store assembly is now strong named -* Known issues with Long Tar names being worked on -* Updated to VS2013 -* Portable targets SL5 and Windows Phone 8 (up from SL4 and WP7) - -### Version 0.10.1 - -* Fixed 7Zip extraction performance problem - -### Version 0.10: - -* Added support for RAR Decryption (thanks to https://github.com/hrasyid) -* Embedded some BouncyCastle crypto classes to allow RAR Decryption and Winzip AES Decryption in Portable and Windows Store DLLs -* Built in Release (I think) +## Notes XZ implementation based on: https://github.com/sambott/XZ.NET by @sambott