Exemplo n.º 1
0
 public QueuedChunk(IList <ISubfile> subfiles, uint id, ArchiveChunkCompression compression, int compressionLevel)
 {
     Subfiles         = subfiles;
     ID               = id;
     Compression      = compression;
     CompressionLevel = compressionLevel;
 }
Exemplo n.º 2
0
        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;
                        }
                    }
                }
            }
        }