Пример #1
0
        /// <inheritdoc/>
        public override void Compress(MemoryStream inputStream, MemoryStream outputStream)
        {
            XZCompressOptions compOpts = new XZCompressOptions
            {
                Level       = (LzmaCompLevel)(int)Level,
                ExtremeFlag = Extreme,
                LeaveOpen   = true
            };

            XZThreadedCompressOptions threadOpts = new XZThreadedCompressOptions
            {
                Threads = Threads,
            };

            inputStream.Position = 0;
            outputStream.SetLength(0);

            using (XZStream xzStream = new XZStream(outputStream, compOpts, threadOpts))
            {
                inputStream.CopyTo(xzStream);
                xzStream.Flush();
            }
        }
Пример #2
0
        private static void CompressTemplate(string sampleFileName, bool useSpan, bool success, int threads, LzmaCompLevel level, bool extreme)
        {
            string destDir = Path.GetTempFileName();

            File.Delete(destDir);
            Directory.CreateDirectory(destDir);
            try
            {
                string tempDecompFile = Path.Combine(destDir, Path.GetFileName(sampleFileName));
                string tempXzFile     = tempDecompFile + ".xz";

                XZCompressOptions compOpts = new XZCompressOptions
                {
                    Level       = level,
                    ExtremeFlag = extreme,
                    LeaveOpen   = true,
                };
                XZThreadedCompressOptions threadOpts = new XZThreadedCompressOptions
                {
                    Threads = threads,
                };

                string sampleFile = Path.Combine(TestSetup.SampleDir, sampleFileName);
                using (FileStream xzCompFs = new FileStream(tempXzFile, FileMode.Create, FileAccess.Write, FileShare.None))
                    using (FileStream sampleFs = new FileStream(sampleFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                        using (XZStream xzs = new XZStream(xzCompFs, compOpts, threadOpts))
                        {
#if !NETFRAMEWORK
                            if (useSpan)
                            {
                                byte[] buffer = new byte[64 * 1024];

                                int bytesRead;
                                do
                                {
                                    bytesRead = sampleFs.Read(buffer.AsSpan());
                                    xzs.Write(buffer.AsSpan(0, bytesRead));
                                } while (0 < bytesRead);
                            }
                            else
#endif
                            {
                                sampleFs.CopyTo(xzs);
                            }

                            xzs.Flush();
                            xzs.GetProgress(out ulong finalIn, out ulong finalOut);

                            Assert.AreEqual(sampleFs.Length, xzs.TotalIn);
                            Assert.AreEqual(xzCompFs.Length, xzs.TotalOut);
                            Assert.AreEqual((ulong)sampleFs.Length, finalIn);
                            Assert.AreEqual((ulong)xzCompFs.Length, finalOut);
                        }

                Assert.IsTrue(TestHelper.RunXZ(tempXzFile) == 0);

                byte[] decompDigest;
                byte[] originDigest;
                using (FileStream fs = new FileStream(sampleFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    using (HashAlgorithm hash = SHA256.Create())
                    {
                        originDigest = hash.ComputeHash(fs);
                    }
                }

                using (FileStream fs = new FileStream(tempDecompFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    using (HashAlgorithm hash = SHA256.Create())
                    {
                        decompDigest = hash.ComputeHash(fs);
                    }
                }

                Assert.IsTrue(originDigest.SequenceEqual(decompDigest));
                Assert.IsTrue(success);
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception)
            {
                Assert.IsFalse(success);
            }
#pragma warning restore CA1031 // Do not catch general exception types
            finally
            {
                if (Directory.Exists(destDir))
                {
                    Directory.Delete(destDir, true);
                }
            }
        }