Rewind buffer fix for directory extract.

This commit is contained in:
Nanook
2025-08-01 21:47:09 +01:00
parent 35aee6e066
commit 76de7d54c7
6 changed files with 37 additions and 4 deletions

View File

@@ -330,7 +330,7 @@ public class ZipArchive : AbstractWritableArchive<ZipArchiveEntry, ZipVolume>
protected override IReader CreateReaderForSolidExtraction()
{
var stream = Volumes.Single().Stream;
stream.Position = 0;
((IStreamStack)stream).StackSeek(0);
return ZipReader.Open(stream, ReaderOptions, Entries);
}
}

View File

@@ -50,7 +50,6 @@ internal sealed class StreamingZipFilePart : ZipFilePart
if (_decompressionStream is DeflateStream deflateStream)
{
((IStreamStack)rewindableStream).StackSeek(0);
//rewindableStream.Rewind(deflateStream.InputBuffer);
}
Skipped = true;

View File

@@ -22,7 +22,18 @@ internal class StreamingZipHeaderFactory : ZipHeaderFactory
{
if (stream is not SharpCompressStream) //ensure the stream is already a SharpCompressStream. So the buffer/size will already be set
{
throw new ArgumentException("Stream must be a SharpCompressStream", nameof(stream));
if (stream is SourceStream src) //the original code wrapped this with RewindableStream. Wrap with SharpCOmpressStream as we can get the boffer size
{
stream = new SharpCompressStream(
stream,
src.ReaderOptions.LeaveStreamOpen,
bufferSize: src.ReaderOptions.BufferSize
);
}
else
{
throw new ArgumentException("Stream must be a SharpCompressStream", nameof(stream));
}
}
SharpCompressStream rewindableStream = (SharpCompressStream)stream;

View File

@@ -252,6 +252,25 @@ public class ArchiveTests : ReaderTests
}
}
protected void ArchiveExtractToDirectory(
string testArchive,
ReaderOptions? readerOptions = null
) => ArchiveExtractToDirectory(ArchiveFactory.AutoFactory, testArchive, readerOptions);
protected void ArchiveExtractToDirectory(
IArchiveFactory archiveFactory,
string testArchive,
ReaderOptions? readerOptions = null
)
{
testArchive = Path.Combine(TEST_ARCHIVES_PATH, testArchive);
using (var archive = archiveFactory.Open(new FileInfo(testArchive), readerOptions))
{
archive.ExtractToDirectory(SCRATCH_FILES_PATH);
}
VerifyFiles();
}
protected void ArchiveFileRead(
IArchiveFactory archiveFactory,
string testArchive,

View File

@@ -47,7 +47,7 @@ public abstract class ReaderTests : TestBase
{
UseReader(reader, expectedCompression);
protectedStream.ThrowOnDispose = false;
Assert.False(testStream.IsDisposed, "{nameof(testStream)} prematurely closed");
Assert.False(testStream.IsDisposed, $"{nameof(testStream)} prematurely closed");
}
// Boolean XOR -- If the stream should be left open (true), then the stream should not be diposed (false)

View File

@@ -88,6 +88,10 @@ public class ZipArchiveTests : ArchiveTests
[Fact]
public void Zip_Deflate_ArchiveFileRead() => ArchiveFileRead("Zip.deflate.zip");
[Fact]
public void Zip_Deflate_ArchiveExtractToDirectory() =>
ArchiveExtractToDirectory("Zip.deflate.zip");
//will detect and load other files
[Fact]
public void Zip_Deflate_Multi_ArchiveFirstFileRead() =>