/// <summary>
 /// Opens an Archive for random access
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="readerOptions"></param>
 /// <returns></returns>
 public static IArchive Open(Stream stream, ReaderOptions?readerOptions = null)
 {
     stream.CheckNotNull(nameof(stream));
     if (!stream.CanRead || !stream.CanSeek)
     {
         throw new ArgumentException("Stream should be readable and seekable");
     }
     readerOptions ??= new ReaderOptions();
     if (ZipArchive.IsZipFile(stream, null))
     {
         stream.Seek(0, SeekOrigin.Begin);
         return(ZipArchive.Open(stream, readerOptions));
     }
     stream.Seek(0, SeekOrigin.Begin);
     if (SevenZipArchive.IsSevenZipFile(stream))
     {
         stream.Seek(0, SeekOrigin.Begin);
         return(SevenZipArchive.Open(stream, readerOptions));
     }
     stream.Seek(0, SeekOrigin.Begin);
     if (GZipArchive.IsGZipFile(stream))
     {
         stream.Seek(0, SeekOrigin.Begin);
         return(GZipArchive.Open(stream, readerOptions));
     }
     stream.Seek(0, SeekOrigin.Begin);
     if (DmgArchive.IsDmgFile(stream))
     {
         stream.Seek(0, SeekOrigin.Begin);
         return(DmgArchive.Open(stream, readerOptions));
     }
     stream.Seek(0, SeekOrigin.Begin);
     if (RarArchive.IsRarFile(stream, readerOptions))
     {
         stream.Seek(0, SeekOrigin.Begin);
         return(RarArchive.Open(stream, readerOptions));
     }
     stream.Seek(0, SeekOrigin.Begin);
     if (TarArchive.IsTarFile(stream))
     {
         stream.Seek(0, SeekOrigin.Begin);
         return(TarArchive.Open(stream, readerOptions));
     }
     throw new InvalidOperationException("Cannot determine compressed stream type. Supported Archive Formats: Zip, GZip, Tar, Rar, 7Zip, LZip, Dmg");
 }
Exemple #2
0
        public DmgVolume(DmgArchive archive, Stream stream, string fileName, Readers.ReaderOptions readerOptions)
            : base(stream, readerOptions)
        {
            _archive  = archive;
            _fileName = fileName;

            long pos = stream.Length - DmgHeader.HeaderSize;

            if (pos < 0)
            {
                throw new InvalidFormatException("Invalid DMG volume");
            }
            stream.Position = pos;

            if (DmgHeader.TryRead(stream, out var header))
            {
                Header = header !;
            }
            else
            {
                throw new InvalidFormatException("Invalid DMG volume");
            }
        }