4 using SharpCompress.Archive.GZip;
7 using SharpCompress.Archive.Rar;
10 using SharpCompress.Archive.Tar;
12 using SharpCompress.Archive.Zip;
13 using SharpCompress.Common;
14 using SharpCompress.Compressor;
16 using SharpCompress.Compressor.BZip2;
18 using SharpCompress.IO;
20 using SharpCompress.Reader.GZip;
23 using SharpCompress.Reader.Rar;
26 using SharpCompress.Reader.Tar;
28 using SharpCompress.Reader.Zip;
30 using GZipStream = SharpCompress.Compressor.Deflate.GZipStream;
33 namespace SharpCompress.Reader
35 internal static class ReaderFactory
38 /// Opens a Reader for Non-seeking usage
40 /// <param name="stream"></param>
41 /// <param name="options"></param>
42 /// <returns></returns>
43 public static IReader Open(Stream stream, Options options = Options.KeepStreamsOpen)
45 stream.CheckNotNull("stream");
47 RewindableStream rewindableStream = new RewindableStream(stream);
48 rewindableStream.StartRecording();
49 if (ZipArchive.IsZipFile(rewindableStream, null))
51 rewindableStream.Rewind(true);
52 return ZipReader.Open(rewindableStream, null, options);
55 rewindableStream.Rewind(false);
56 if (GZipArchive.IsGZipFile(rewindableStream))
58 rewindableStream.Rewind(false);
59 GZipStream testStream = new GZipStream(rewindableStream, CompressionMode.Decompress);
60 if (TarArchive.IsTarFile(testStream))
62 rewindableStream.Rewind(true);
63 return new TarReader(rewindableStream, CompressionType.GZip, options);
65 rewindableStream.Rewind(true);
66 return GZipReader.Open(rewindableStream, options);
71 rewindableStream.Rewind(false);
72 if (BZip2Stream.IsBZip2(rewindableStream))
74 rewindableStream.Rewind(false);
75 BZip2Stream testStream = new BZip2Stream(rewindableStream, CompressionMode.Decompress, false);
77 if (TarArchive.IsTarFile(testStream))
79 rewindableStream.Rewind(true);
80 return new TarReader(rewindableStream, CompressionType.BZip2, options);
87 rewindableStream.Rewind(false);
88 if (TarArchive.IsTarFile(rewindableStream))
90 rewindableStream.Rewind(true);
91 return TarReader.Open(rewindableStream, options);
95 rewindableStream.Rewind(false);
96 if (RarArchive.IsRarFile(rewindableStream, options))
98 rewindableStream.Rewind(true);
99 return RarReader.Open(rewindableStream, options);
103 throw new InvalidOperationException("Cannot determine compressed stream type. Supported Reader Formats: Zip, GZip, BZip2, Tar, Rar");