3

我想在通过网络发送文件之前对其进行压缩。我认为最好的方法是 7zip,因为它是免费和开源的。

我如何将 7zip 与 .net 一起使用?

我知道这7zip是免费的,并且他们在 c# 中有源代码,但由于某种原因,它在 c# 上非常慢,所以7z.dll出于性能原因,我宁愿调用安装 7zip 时附带的 dll。因此,我能够轻松编组和调用方法的方式 7z.dll是在名为Sevenzipsharp的库的帮助下。例如,将该 dll 添加到我的项目中将使我能够执行以下操作:

在此处输入图像描述

        // if you installed 7zip 64bit version then make sure you change plataform target
        // like on the picture I showed above!
        SevenZip.SevenZipCompressor.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");

        var stream = System.IO.File.OpenRead(@"SomeFileToCompress.txt");
        var outputStream = System.IO.File.Create("Output.7z");

        SevenZip.SevenZipCompressor compressor = new SevenZip.SevenZipCompressor();
        compressor.CompressionMethod = SevenZip.CompressionMethod.Lzma2;
        compressor.CompressionLevel = SevenZip.CompressionLevel.Ultra;
        compressor.CompressStream(stream, outputStream);

这就是我在 c# 中使用 7zip 的方式。

现在我的问题是:

我想通过网络发送一个压缩文件。我知道我可以先压缩它然后发送它。该文件是4GB,所以我将不得不等待很长时间才能压缩它。我将在硬盘驱动器上浪费大量空间。然后我终于可以发送它了。我认为这太复杂了。我想知道如何在压缩文件的同时发送文件。


SevenZipSharp 似乎有问题:

在此处输入图像描述

4

2 回答 2

2

您是否考虑过备用库 - 一个甚至不需要安装/可用 7-Zip 的库?

http://dotnetzip.codeplex.com/上发布的描述中:

从流内容创建 zip 文件、保存到流、提取到流、从流中读取

与 7-Zip 不同,DotNetZip 旨在与 C# / .Net 一起使用。

大量示例(包括流式传输)可在http://dotnetzip.codeplex.com/wikipage?title=CS-Examples&referringTitle=Examples 获得

另一种选择是使用 7-Zip 命令行版本 (7z.exe),并从标准输入/输出写入/读取。这将允许您使用 7-Zip 文件格式,同时将所有核心工作保留在本机代码中(尽管可能不会有太大的显着差异)。

回顾 SevenZipSharp:

自 0.29 版本以来,支持流式传输。

查看http://sevenzipsharp.codeplex.com/SourceControl/changeset/view/59007#364711

看来您需要这种方法:

public void CompressStream(Stream inStream, Stream outStream)

感谢您在这里考虑性能!我认为太多人会做你想要避免的事情:压缩到临时文件,然后对临时文件做一些事情。

于 2012-09-08T04:52:34.240 回答
0

CompressStream 抛出异常。我的代码如下:

    public void TestCompress()
    {
        string fileToCompress = @"C:\Users\gary\Downloads\BD01.DAT";
        byte[] inputBytes = File.ReadAllBytes(fileToCompress);
        var inputStream = new MemoryStream(inputBytes);

        byte[] zipBytes = new byte[38000000];   // this memory size is large enough.
        MemoryStream outStream = new MemoryStream(zipBytes);

        string compressorEnginePath = @"C:\Engine\7z.dll";
        SevenZipCompressor.SetLibraryPath(compressorEnginePath);

        compressor = new SevenZip.SevenZipCompressor();
        compressor.CompressionLevel = CompressionLevel.Fast;
        compressor.CompressionMethod = CompressionMethod.Lzma2;
        compressor.CompressStream(inputStream, outputStream);

        inputStream.Close();
        outputStream.Close();

异常消息:消息:测试方法 Test7zip.UnitTest1.TestCompress 抛出异常:SevenZip.SevenZipException:由于 SevenZipSharp 中的错误,执行失败。请向http://sevenzipsharp.codeplex.com/WorkItem/List.aspx报告,发布版本号并附上存档

于 2018-12-27T00:40:41.040 回答