tar fixes

This commit is contained in:
Adam Hathcock
2026-01-20 12:22:38 +00:00
parent 8abb972f87
commit 2175cb299d
9 changed files with 131 additions and 39 deletions

View File

@@ -76,4 +76,30 @@ public class TarEntry : Entry
}
}
}
internal static async IAsyncEnumerable<TarEntry> GetEntriesAsync(
StreamingMode mode,
Stream stream,
CompressionType compressionType,
IArchiveEncoding archiveEncoding
)
{
await foreach (var header in TarHeaderFactory.ReadHeaderAsync(mode, stream, archiveEncoding))
{
if (header != null)
{
if (mode == StreamingMode.Seekable)
{
yield return new TarEntry(new TarFilePart(header, stream), compressionType);
}
else
{
yield return new TarEntry(new TarFilePart(header, null), compressionType);
}
}
else
{
throw new IncompleteArchiveException("Unexpected EOF reading tar file");
}
}
}
}

View File

@@ -278,6 +278,22 @@ public class DeflateStream : Stream, IStreamStack
}
}
#if !NETFRAMEWORK && !NETSTANDARD2_0
public override async ValueTask DisposeAsync()
{
if (!_disposed)
{
#if DEBUG_STREAMS
this.DebugDispose(typeof(DeflateStream));
#endif
await _baseStream.DisposeAsync().ConfigureAwait(false);
_disposed = true;
}
await base.DisposeAsync().ConfigureAwait(false);
}
#endif
/// <summary>
/// Flush the stream.
/// </summary>
@@ -299,24 +315,6 @@ public class DeflateStream : Stream, IStreamStack
await _baseStream.FlushAsync(cancellationToken).ConfigureAwait(false);
}
#if !NETFRAMEWORK && !NETSTANDARD2_0
public override async ValueTask DisposeAsync()
{
if (_disposed)
{
return;
}
_disposed = true;
if (_baseStream != null)
{
await _baseStream.DisposeAsync().ConfigureAwait(false);
}
#if DEBUG_STREAMS
this.DebugDispose(typeof(DeflateStream));
#endif
await base.DisposeAsync().ConfigureAwait(false);
}
#endif
/// <summary>
/// Read data from the stream.

View File

@@ -141,23 +141,23 @@ public class SharpCompressStream : Stream, IStreamStack
#if DEBUG_STREAMS
this.DebugDispose(typeof(SharpCompressStream));
#endif
if (_isDisposed)
{
return;
}
_isDisposed = true;
base.Dispose(disposing);
if (this.LeaveOpen)
{
return;
}
if (ThrowOnDispose)
{
throw new InvalidOperationException(
$"Attempt to dispose of a {nameof(SharpCompressStream)} when {nameof(ThrowOnDispose)} is {ThrowOnDispose}"
);
}
if (_isDisposed)
{
return;
}
_isDisposed = true;
base.Dispose(disposing);
if (disposing)
{
Stream.Dispose();
@@ -450,5 +450,36 @@ public class SharpCompressStream : Stream, IStreamStack
_internalPosition += buffer.Length;
}
public override async ValueTask DisposeAsync()
{
#if DEBUG_STREAMS
this.DebugDispose(typeof(SharpCompressStream));
#endif
if (this.LeaveOpen)
{
return;
}
if (ThrowOnDispose)
{
throw new InvalidOperationException(
$"Attempt to dispose of a {nameof(SharpCompressStream)} when {nameof(ThrowOnDispose)} is {ThrowOnDispose}"
);
}
if (_isDisposed)
{
return;
}
_isDisposed = true;
await base.DisposeAsync();
await Stream.DisposeAsync();
if (_buffer != null)
{
ArrayPool<byte>.Shared.Return(_buffer);
_buffer = null;
}
}
#endif
}

View File

@@ -119,4 +119,11 @@ public partial class TarReader : AbstractReader<TarEntry, TarVolume>
compressionType,
Options.ArchiveEncoding
);
protected override IAsyncEnumerable<TarEntry> GetEntriesAsync(Stream stream) =>
TarEntry.GetEntriesAsync(
StreamingMode.Streaming,
stream,
compressionType,
Options.ArchiveEncoding
);
}