From fad7cf3b1d034bc8212bf04c1ce9b80dbe6f85b1 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 4 Feb 2026 16:07:06 +0000 Subject: [PATCH] fix usages of AsyncBinaryReader --- .../Archives/Tar/TarArchive.Factory.cs | 6 +++++- .../Common/Rar/AsyncMarkingBinaryReader.cs | 1 + .../Common/Tar/Headers/TarHeader.Async.cs | 1 + .../Common/Tar/TarHeaderFactory.Async.cs | 7 ++++++- .../Common/Zip/Headers/DirectoryEndHeader.Async.cs | 1 + .../Zip/Headers/DirectoryEntryHeader.Async.cs | 1 + .../Common/Zip/Headers/IgnoreHeader.cs | 1 + .../Common/Zip/Headers/LocalEntryHeader.Async.cs | 1 + src/SharpCompress/Common/Zip/Headers/SplitHeader.cs | 1 + .../Zip/Headers/Zip64DirectoryEndHeader.Async.cs | 1 + .../Headers/Zip64DirectoryEndLocatorHeader.Async.cs | 1 + src/SharpCompress/Common/Zip/Headers/ZipHeader.cs | 1 + .../Common/Zip/SeekableZipHeaderFactory.Async.cs | 13 +++++++++++-- .../{Common => IO}/AsyncBinaryReader.cs | 10 +++++----- 14 files changed, 37 insertions(+), 9 deletions(-) rename src/SharpCompress/{Common => IO}/AsyncBinaryReader.cs (92%) diff --git a/src/SharpCompress/Archives/Tar/TarArchive.Factory.cs b/src/SharpCompress/Archives/Tar/TarArchive.Factory.cs index a1b834e8..959b4ab4 100644 --- a/src/SharpCompress/Archives/Tar/TarArchive.Factory.cs +++ b/src/SharpCompress/Archives/Tar/TarArchive.Factory.cs @@ -176,7 +176,11 @@ public partial class TarArchive try { var tarHeader = new TarHeader(new ArchiveEncoding()); - var reader = new AsyncBinaryReader(stream, false); +#if NET8_0_OR_GREATER + await using var reader = new AsyncBinaryReader(stream, leaveOpen: true); +#else + using var reader = new AsyncBinaryReader(stream, leaveOpen: true); +#endif var readSucceeded = await tarHeader.ReadAsync(reader); var isEmptyArchive = tarHeader.Name?.Length == 0 diff --git a/src/SharpCompress/Common/Rar/AsyncMarkingBinaryReader.cs b/src/SharpCompress/Common/Rar/AsyncMarkingBinaryReader.cs index 57837f84..5b58e0a2 100644 --- a/src/SharpCompress/Common/Rar/AsyncMarkingBinaryReader.cs +++ b/src/SharpCompress/Common/Rar/AsyncMarkingBinaryReader.cs @@ -4,6 +4,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using SharpCompress.Common; +using SharpCompress.IO; namespace SharpCompress.Common.Rar; diff --git a/src/SharpCompress/Common/Tar/Headers/TarHeader.Async.cs b/src/SharpCompress/Common/Tar/Headers/TarHeader.Async.cs index e3ca687f..f5d796a4 100644 --- a/src/SharpCompress/Common/Tar/Headers/TarHeader.Async.cs +++ b/src/SharpCompress/Common/Tar/Headers/TarHeader.Async.cs @@ -6,6 +6,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; +using SharpCompress.IO; namespace SharpCompress.Common.Tar.Headers; diff --git a/src/SharpCompress/Common/Tar/TarHeaderFactory.Async.cs b/src/SharpCompress/Common/Tar/TarHeaderFactory.Async.cs index ad6a357e..59e0fc6b 100644 --- a/src/SharpCompress/Common/Tar/TarHeaderFactory.Async.cs +++ b/src/SharpCompress/Common/Tar/TarHeaderFactory.Async.cs @@ -13,12 +13,17 @@ internal static partial class TarHeaderFactory IArchiveEncoding archiveEncoding ) { +#if NET8_0_OR_GREATER + await using var reader = new AsyncBinaryReader(stream, leaveOpen: true); +#else + using var reader = new AsyncBinaryReader(stream, leaveOpen: true); +#endif + while (true) { TarHeader? header = null; try { - var reader = new AsyncBinaryReader(stream, false); header = new TarHeader(archiveEncoding); if (!await header.ReadAsync(reader)) { diff --git a/src/SharpCompress/Common/Zip/Headers/DirectoryEndHeader.Async.cs b/src/SharpCompress/Common/Zip/Headers/DirectoryEndHeader.Async.cs index 811beeff..86e0f771 100644 --- a/src/SharpCompress/Common/Zip/Headers/DirectoryEndHeader.Async.cs +++ b/src/SharpCompress/Common/Zip/Headers/DirectoryEndHeader.Async.cs @@ -1,5 +1,6 @@ using System.IO; using System.Threading.Tasks; +using SharpCompress.IO; namespace SharpCompress.Common.Zip.Headers; diff --git a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.Async.cs b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.Async.cs index e723f1e5..6cc356d6 100644 --- a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.Async.cs +++ b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.Async.cs @@ -2,6 +2,7 @@ using System.IO; using System.Linq; using System.Threading.Tasks; using SharpCompress.Common; +using SharpCompress.IO; namespace SharpCompress.Common.Zip.Headers; diff --git a/src/SharpCompress/Common/Zip/Headers/IgnoreHeader.cs b/src/SharpCompress/Common/Zip/Headers/IgnoreHeader.cs index 9c648baf..86b66a81 100644 --- a/src/SharpCompress/Common/Zip/Headers/IgnoreHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/IgnoreHeader.cs @@ -1,5 +1,6 @@ using System.IO; using System.Threading.Tasks; +using SharpCompress.IO; namespace SharpCompress.Common.Zip.Headers; diff --git a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.Async.cs b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.Async.cs index 3a7426a1..9a8a991e 100644 --- a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.Async.cs +++ b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeader.Async.cs @@ -1,6 +1,7 @@ using System.IO; using System.Linq; using System.Threading.Tasks; +using SharpCompress.IO; namespace SharpCompress.Common.Zip.Headers; diff --git a/src/SharpCompress/Common/Zip/Headers/SplitHeader.cs b/src/SharpCompress/Common/Zip/Headers/SplitHeader.cs index 29aaabaa..d5e68fee 100644 --- a/src/SharpCompress/Common/Zip/Headers/SplitHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/SplitHeader.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Threading.Tasks; +using SharpCompress.IO; namespace SharpCompress.Common.Zip.Headers; diff --git a/src/SharpCompress/Common/Zip/Headers/Zip64DirectoryEndHeader.Async.cs b/src/SharpCompress/Common/Zip/Headers/Zip64DirectoryEndHeader.Async.cs index 386db415..9bbfe4f8 100644 --- a/src/SharpCompress/Common/Zip/Headers/Zip64DirectoryEndHeader.Async.cs +++ b/src/SharpCompress/Common/Zip/Headers/Zip64DirectoryEndHeader.Async.cs @@ -1,5 +1,6 @@ using System.IO; using System.Threading.Tasks; +using SharpCompress.IO; namespace SharpCompress.Common.Zip.Headers; diff --git a/src/SharpCompress/Common/Zip/Headers/Zip64DirectoryEndLocatorHeader.Async.cs b/src/SharpCompress/Common/Zip/Headers/Zip64DirectoryEndLocatorHeader.Async.cs index 804f05da..c4188c8b 100644 --- a/src/SharpCompress/Common/Zip/Headers/Zip64DirectoryEndLocatorHeader.Async.cs +++ b/src/SharpCompress/Common/Zip/Headers/Zip64DirectoryEndLocatorHeader.Async.cs @@ -1,5 +1,6 @@ using System.IO; using System.Threading.Tasks; +using SharpCompress.IO; namespace SharpCompress.Common.Zip.Headers; diff --git a/src/SharpCompress/Common/Zip/Headers/ZipHeader.cs b/src/SharpCompress/Common/Zip/Headers/ZipHeader.cs index 9ce1caa3..5daf0560 100644 --- a/src/SharpCompress/Common/Zip/Headers/ZipHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/ZipHeader.cs @@ -1,5 +1,6 @@ using System.IO; using System.Threading.Tasks; +using SharpCompress.IO; namespace SharpCompress.Common.Zip.Headers; diff --git a/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.Async.cs b/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.Async.cs index 4eaf7c1f..23422ae4 100644 --- a/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.Async.cs +++ b/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.Async.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using SharpCompress.Common.Zip.Headers; +using SharpCompress.IO; namespace SharpCompress.Common.Zip; @@ -11,7 +12,11 @@ internal sealed partial class SeekableZipHeaderFactory { internal async IAsyncEnumerable ReadSeekableHeaderAsync(Stream stream) { - var reader = new AsyncBinaryReader(stream); +#if NET8_0_OR_GREATER + await using var reader = new AsyncBinaryReader(stream, leaveOpen: true); +#else + using var reader = new AsyncBinaryReader(stream, leaveOpen: true); +#endif await SeekBackToHeaderAsync(stream, reader); @@ -127,7 +132,11 @@ internal sealed partial class SeekableZipHeaderFactory ) { stream.Seek(directoryEntryHeader.RelativeOffsetOfEntryHeader, SeekOrigin.Begin); - var reader = new AsyncBinaryReader(stream); +#if NET8_0_OR_GREATER + await using var reader = new AsyncBinaryReader(stream, leaveOpen: true); +#else + using var reader = new AsyncBinaryReader(stream, leaveOpen: true); +#endif var signature = await reader.ReadUInt32Async(); if (await ReadHeader(signature, reader, _zip64) is not LocalEntryHeader localEntryHeader) { diff --git a/src/SharpCompress/Common/AsyncBinaryReader.cs b/src/SharpCompress/IO/AsyncBinaryReader.cs similarity index 92% rename from src/SharpCompress/Common/AsyncBinaryReader.cs rename to src/SharpCompress/IO/AsyncBinaryReader.cs index f8e08240..55cb6aa9 100644 --- a/src/SharpCompress/Common/AsyncBinaryReader.cs +++ b/src/SharpCompress/IO/AsyncBinaryReader.cs @@ -4,9 +4,12 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace SharpCompress.Common; +namespace SharpCompress.IO; public sealed class AsyncBinaryReader : IDisposable +#if NET8_0_OR_GREATER +, IAsyncDisposable +#endif { private readonly Stream _stream; private readonly Stream _originalStream; @@ -14,7 +17,7 @@ public sealed class AsyncBinaryReader : IDisposable private readonly byte[] _buffer = new byte[8]; private bool _disposed; - public AsyncBinaryReader(Stream stream, bool leaveOpen = false, int bufferSize = 4096) + public AsyncBinaryReader(Stream stream, bool leaveOpen = false) { if (!stream.CanRead) { @@ -23,9 +26,6 @@ public sealed class AsyncBinaryReader : IDisposable _originalStream = stream ?? throw new ArgumentNullException(nameof(stream)); _leaveOpen = leaveOpen; - - // Use the stream directly without wrapping in BufferedStream - // BufferedStream uses synchronous Read internally which doesn't work with async-only streams _stream = stream; }