static void Main() { Directory.CreateDirectory("_test"); bool writeArchive = true; bool useOldWriter = false; bool readArchive = true; bool useOldReader = false; if (writeArchive) { if (useOldWriter) { using (var stream = new FileStream(@"_test\test.7z", FileMode.Create, FileAccess.ReadWrite, FileShare.Delete)) using (var encryption = new AESEncryptionProvider("test")) using (var encoder = new ArchiveWriter.Lzma2Encoder(null)) { var writer = new ArchiveWriter(stream); writer.DefaultEncryptionProvider = encryption; writer.ConnectEncoder(encoder); string path = Path.GetDirectoryName(typeof(Program).Assembly.Location); var directory = new DirectoryInfo(path); foreach (string filename in Directory.EnumerateFiles(path)) { writer.WriteFile(directory, new FileInfo(filename)); } writer.WriteFinalHeader(); } } else { Task.Run(async delegate { using (var archiveStream = new FileStream(@"_test\test.7z", FileMode.Create, FileAccess.ReadWrite, FileShare.Delete)) using (var archiveWriter = ManagedLzma.SevenZip.Writer.ArchiveWriter.Create(archiveStream, false)) { var encoder = new ManagedLzma.SevenZip.Writer.EncoderDefinition(); ManagedLzma.SevenZip.Writer.EncoderNodeDefinition node1 = null; ManagedLzma.SevenZip.Writer.EncoderNodeDefinition node2 = null; //node1 = encoder.CreateEncoder(ManagedLzma.SevenZip.Encoders.CopyEncoderSettings.Instance); //node1 = encoder.CreateEncoder(new ManagedLzma.SevenZip.Encoders.LzmaEncoderSettings(new ManagedLzma.LZMA.EncoderSettings())); //node1 = encoder.CreateEncoder(new ManagedLzma.SevenZip.Encoders.Lzma2EncoderSettings(new ManagedLzma.LZMA2.EncoderSettings())); node2 = encoder.CreateEncoder(new ManagedLzma.SevenZip.Writer.AesEncoderSettings(ManagedLzma.PasswordStorage.Create("test"))); if (node1 != null && node2 != null) { encoder.Connect(encoder.GetContentSource(), node1.GetInput(0)); encoder.Connect(node1.GetOutput(0), node2.GetInput(0)); encoder.Connect(node2.GetOutput(0), encoder.CreateStorageSink()); } else { encoder.Connect(encoder.GetContentSource(), (node1 ?? node2).GetInput(0)); encoder.Connect((node1 ?? node2).GetOutput(0), encoder.CreateStorageSink()); } encoder.Complete(); var metadata = new ManagedLzma.SevenZip.Writer.ArchiveMetadataRecorder(); var directory = new DirectoryInfo(Path.GetDirectoryName(typeof(Program).Assembly.Location)); bool useDistinctEncoders = false; if (useDistinctEncoders) { foreach (var file in directory.EnumerateFiles()) { using (var session = archiveWriter.BeginEncoding(encoder, true)) { using (var fileStream = file.OpenRead()) { var result = await session.AppendStream(fileStream, true); metadata.AppendFile(file.Name, result.Length, result.Checksum, file.Attributes, file.CreationTimeUtc, file.LastWriteTimeUtc, file.LastAccessTimeUtc); } // TODO: ensure that everything still aborts properly if we don't call complete await session.Complete(); } } } else { using (var session = archiveWriter.BeginEncoding(encoder, true)) { foreach (var file in directory.EnumerateFiles()) { using (var fileStream = file.OpenRead()) { var result = await session.AppendStream(fileStream, true); metadata.AppendFile(file.Name, result.Length, result.Checksum, file.Attributes, file.CreationTimeUtc, file.LastWriteTimeUtc, file.LastAccessTimeUtc); } } // TODO: ensure that everything still aborts properly if we don't call complete await session.Complete(); } } await archiveWriter.WriteMetadata(metadata); await archiveWriter.WriteHeader(); } }).GetAwaiter().GetResult(); } } if (readArchive) { if (useOldReader) { var pass = new Password("test"); var db = new master._7zip.Legacy.CArchiveDatabaseEx(); var x = new master._7zip.Legacy.ArchiveReader(); x.Open(new FileStream(@"_test\test.7z", FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete)); x.ReadDatabase(db, pass); db.Fill(); x.Extract(db, null, pass); } else { var file = new FileStream(@"_test\test.7z", FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete); var mdReader = new ManagedLzma.SevenZip.FileModel.ArchiveFileModelMetadataReader(); var mdModel = mdReader.ReadMetadata(file); var password = ManagedLzma.PasswordStorage.Create("test"); for (int sectionIndex = 0; sectionIndex < mdModel.Metadata.DecoderSections.Length; sectionIndex++) { var dsReader = new ManagedLzma.SevenZip.Reader.DecodedSectionReader(file, mdModel.Metadata, sectionIndex, password); var mdFiles = mdModel.GetFilesInSection(sectionIndex); System.Diagnostics.Debug.Assert(mdFiles.Count == dsReader.StreamCount); int k = 0; while (dsReader.CurrentStreamIndex < dsReader.StreamCount) { var mdFile = mdFiles[dsReader.CurrentStreamIndex]; if (mdFile != null) { System.Diagnostics.Debug.Assert(mdFile.Stream.SectionIndex == sectionIndex); System.Diagnostics.Debug.Assert(mdFile.Stream.StreamIndex == dsReader.CurrentStreamIndex); var substream = dsReader.OpenStream(); using (var outstream = new FileStream(@"_test\output_" + (++k) + "_" + mdFile.Name, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete)) { outstream.SetLength(0); if (mdFile.Offset != 0) { throw new NotImplementedException(); } substream.CopyTo(outstream); } } dsReader.NextStream(); } } } } }