7zip压缩网络流

时间:2012-09-08 04:40:41

标签: c# networking compression 7zip

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

我如何使用7zip与.net?

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

enter image description here

        // 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的一个问题:

enter image description here

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

CompressStream引发异常。我的代码如下:

def inc(x):
    return x + 1

def double(x):
    return x + 2

def add(x, y):
    return x + y

data = [1, 2, 3, 4, 5]

output = []
for x in data:
    a = inc(x)
    b = double(x)
    c = add(a, b)
    output.append(c)

total = sum(output)

import dask

output = []
for x in data:
    a = dask.delayed(inc)(x)
    b = dask.delayed(double)(x)
    c = dask.delayed(add)(a, b)
    output.append(c)

total = dask.delayed(sum)(output)

total.visualize()  # see image to the right

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