public QueuedChunk(IList <ISubfile> subfiles, uint id, ArchiveChunkCompression compression, int compressionLevel) { Subfiles = subfiles; ID = id; Compression = compression; CompressionLevel = compressionLevel; }
public void TestCompression() { if (trvFiles.SelectedNode != null) { IProgress <Tuple <string, int> > progress = new Progress <Tuple <string, int> >((x) => { prgFileProgress.Value = x.Item2; txtFileProg.AppendText(x.Item1); }); ArchiveChunkCompression method = (ArchiveChunkCompression)cmbCompression.SelectedIndex; if (trvFiles.SelectedNode.Tag == null) { //Is a PP file node List <SubfileHolder> items = trvFiles.SelectedNode.Nodes .Cast <TreeNode>() .Select(x => x.Tag as SubfileHolder) .ToList(); prgFileProgress.Value = 0; int i = 0; Task.Run(() => { long ucb = 0; long cb = 0; foreach (var item in items) { ucb += (long)item.Size; using (Stream data = item.Source.GetStream()) cb += PPeX.Utility.TestCompression(data, method); progress.Report(new Tuple <string, int>( "", 100 * i / items.Count)); } string uncompressedSize = PPeX.Utility.GetBytesReadable(ucb); string size = PPeX.Utility.GetBytesReadable(cb); string ratio = ((double)cb / ucb).ToString("P2"); switch (method) { case ArchiveChunkCompression.Uncompressed: progress.Report(new Tuple <string, int>("No compression: " + uncompressedSize + " => " + size + " (" + ratio + ")\n", 100)); break; case ArchiveChunkCompression.LZ4: progress.Report(new Tuple <string, int>("LZ4 compression: " + uncompressedSize + " => " + size + " (" + ratio + ")\n", 100)); break; case ArchiveChunkCompression.Zstandard: progress.Report(new Tuple <string, int>("Zstandard compression: " + uncompressedSize + " => " + size + " (" + ratio + ")\n", 100)); break; } }); } else { //Is a PP subfile node SubfileHolder sh = trvFiles.SelectedNode.Tag as SubfileHolder; using (Stream stream = sh.Source.GetStream()) { string uncompressedSize = PPeX.Utility.GetBytesReadable(stream.Length); long bytes = PPeX.Utility.TestCompression(stream, method); string size = PPeX.Utility.GetBytesReadable(bytes); string ratio = ((double)bytes / stream.Length).ToString("P2"); switch (method) { case ArchiveChunkCompression.Uncompressed: progress.Report(new Tuple <string, int>("No compression: " + uncompressedSize + " => " + size + " (" + ratio + ")\n", 100)); break; case ArchiveChunkCompression.LZ4: progress.Report(new Tuple <string, int>("LZ4 compression: " + uncompressedSize + " => " + size + " (" + ratio + ")\n", 100)); break; case ArchiveChunkCompression.Zstandard: progress.Report(new Tuple <string, int>("Zstandard compression: " + uncompressedSize + " => " + size + " (" + ratio + ")\n", 100)); break; } } } } }