public Packer GetPacker(string path, byte[] key = null) { Packer packer = null; using (var input = new FileStream(path, FileMode.Open, FileAccess.Read)) { byte mode = Convert.ToByte(input.ReadByte()); if (mode == Mode.Full) { packer = new FullPacker(); packer.Compressor = GetCompressor(input.ReadByte()); ICipher cipher = GetCipher(input.ReadByte(), key); packer.Encryptor = GetEncryptor(input.ReadByte(), cipher, input); } else if (mode == Mode.Compress) { packer = new CompressionPacker { Compressor = GetCompressor(input.ReadByte()) } } ; else if (mode == Mode.Encrypt) { packer = new EncryptionPacker(); ICipher cipher = GetCipher(input.ReadByte(), key); packer.Encryptor = GetEncryptor(input.ReadByte(), cipher, input); packer.Encryptor.Cipher = cipher; } else { throw new InvalidOperationException("Invalid file header"); } } return(packer); }