diff --git a/DiscImageChef.Filters/BZip2.cs b/DiscImageChef.Filters/BZip2.cs index 8452314f6..d80d519cd 100644 --- a/DiscImageChef.Filters/BZip2.cs +++ b/DiscImageChef.Filters/BZip2.cs @@ -46,6 +46,7 @@ namespace DiscImageChef.Filters DateTime creationTime; bool opened; long decompressedSize; + Stream innerStream; public BZip2() { @@ -69,9 +70,7 @@ namespace DiscImageChef.Filters public override Stream GetDataForkStream() { - // Otherwise base stream is not at correct position - dataStream.Seek(0, SeekOrigin.Begin); - return new ForcedSeekStream(decompressedSize, dataStream, CompressionMode.Decompress, true, false); + return innerStream; } public override string GetPath() @@ -157,31 +156,14 @@ namespace DiscImageChef.Filters return false; } - // BZIP2 does not store the uncompressed size so we must read the whole file. Whole. Whatever time it takes. Or we couldn't seek on it... - long GuessSize(Stream stream) - { - stream.Seek(0, SeekOrigin.Begin); - BZip2Stream bzStream = new BZip2Stream(stream, CompressionMode.Decompress, true); - long size = 0; - int read = 0; - byte[] buffer = new byte[1048576]; - do - { - read = bzStream.Read(buffer, 0, buffer.Length); - size += read; - } - while(read > 0); - stream.Seek(0, SeekOrigin.Begin); - return size; - } - public override void Open(byte[] buffer) { dataStream = new MemoryStream(buffer); basePath = null; - decompressedSize = GuessSize(dataStream); creationTime = DateTime.UtcNow; lastWriteTime = creationTime; + innerStream = new ForcedSeekStream(dataStream, CompressionMode.Decompress, false, false); + decompressedSize = innerStream.Length; opened = true; } @@ -189,9 +171,10 @@ namespace DiscImageChef.Filters { dataStream = stream; basePath = null; - decompressedSize = GuessSize(dataStream); creationTime = DateTime.UtcNow; lastWriteTime = creationTime; + innerStream = new ForcedSeekStream(dataStream, CompressionMode.Decompress, false, false); + decompressedSize = innerStream.Length; opened = true; } @@ -201,13 +184,15 @@ namespace DiscImageChef.Filters basePath = Path.GetFullPath(path); DateTime start = DateTime.UtcNow; - decompressedSize = GuessSize(dataStream); + //decompressedSize = GuessSize(dataStream); DateTime end = DateTime.UtcNow; DicConsole.DebugWriteLine("BZip2 filter", "Took {0} seconds to guess size is {1}", (end - start).TotalSeconds, decompressedSize); FileInfo fi = new FileInfo(path); creationTime = fi.CreationTimeUtc; lastWriteTime = fi.LastWriteTimeUtc; + innerStream = new ForcedSeekStream(dataStream, CompressionMode.Decompress, false, false); + decompressedSize = innerStream.Length; opened = true; } diff --git a/DiscImageChef.Filters/GZip.cs b/DiscImageChef.Filters/GZip.cs index f6dc8422d..bd778d30e 100644 --- a/DiscImageChef.Filters/GZip.cs +++ b/DiscImageChef.Filters/GZip.cs @@ -44,6 +44,7 @@ namespace DiscImageChef.Filters DateTime creationTime; bool opened; uint decompressedSize; + Stream zStream; public GZip() { @@ -67,9 +68,7 @@ namespace DiscImageChef.Filters public override Stream GetDataForkStream() { - // Otherwise base stream is not at correct position and deflate throws errors - dataStream.Seek(0, SeekOrigin.Begin); - return new ForcedSeekStream(decompressedSize, dataStream, CompressionMode.Decompress); + return zStream; } public override string GetPath() @@ -142,6 +141,7 @@ namespace DiscImageChef.Filters decompressedSize = isize; creationTime = DateHandlers.UNIXUnsignedToDateTime(mtime); lastWriteTime = creationTime; + zStream = new ForcedSeekStream(decompressedSize, dataStream, CompressionMode.Decompress); opened = true; } @@ -167,6 +167,7 @@ namespace DiscImageChef.Filters decompressedSize = isize; creationTime = DateHandlers.UNIXUnsignedToDateTime(mtime); lastWriteTime = creationTime; + zStream = new ForcedSeekStream(decompressedSize, dataStream, CompressionMode.Decompress); opened = true; } @@ -193,6 +194,7 @@ namespace DiscImageChef.Filters FileInfo fi = new FileInfo(path); creationTime = fi.CreationTimeUtc; lastWriteTime = DateHandlers.UNIXUnsignedToDateTime(mtime); + zStream = new ForcedSeekStream(decompressedSize, dataStream, CompressionMode.Decompress); opened = true; }