无法使用7-Zip压缩stdin并输出至stdout?

5
我遇到了“未实现”的错误。
我想使用7-Zip通过stdin压缩文件,然后通过stdout获取数据并在我的应用程序中进行更多的转换。在man页面中,它显示了这个例子: % echo foo | 7z a dummy -tgzip -si -so > /dev/null 我正在使用Windows和C#。
结果:
7-Zip 4.65  Copyright (c) 1999-2009 Igor Pavlov  2009-02-03
Creating archive StdOut

System error:
Not implemented

代码:

public static byte[] a7zipBuf(byte[] b)
{
    string line;
    var p = new Process();
    line = string.Format("a dummy -t7z -si -so ");
    p.StartInfo.Arguments = line;
    p.StartInfo.FileName = @"C:\Program Files\7-Zip\7z.exe";
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.RedirectStandardInput = true;

    p.Start();

    p.StandardInput.BaseStream.Write(b, 0, b.Length);
    p.StandardInput.Close();
    Console.Write(p.StandardError.ReadToEnd());
    //Console.Write(p.StandardOutput.ReadToEnd());

    return p.StandardOutput.BaseStream.ReadFully();
}

有没有其他简单的方法将文件读入内存?

目前我可以 1)先写入临时文件然后再读取(容易操作,可以复制/粘贴一些代码)2)使用文件管道(中等难度?我从未尝试过)3)其他方法。

5个回答

4
您可能想尝试使用类似于SevenZipSharp http://www.codeplex.com/sevenzipsharp的东西,它提供了一个包装器来调用7za.dll COM库,这可能对您有帮助。我自己编写的工具利用了7-Zip通过进程运行,虽然我从未尝试过StdIn和StdOut相关的问题。在我的7-Zip版本的帮助文件中,关于-si开关的页面说明如下:注意:当前版本的7-Zip不支持从标准输入读取存档。不确定是否这可能是您遇到问题的原因,指定两个开关可能会让7-Zip感到困惑。他们在帮助文件中展示的示例似乎表明,-so用于将输出重定向到标准输出,但需要基于普通文件的输入才能实现。

3

以下是来自7z作者Igor Pavlov的一些信息,关于"将7zip作为gzip/bzip2的替代品?"

建议基本上是使用7z作为xz的代理。只使用xz应该可以工作,但它可能不支持多线程(而7z可能支持)。

在尝试使用7z时:

somecommand | 7zr a -si -so | nc -q 2 1.2.3.4 5678

Igor Pavlov说:

无法实现7z a a.7z -so和7z e a.7z -si。因为.7z格式需要"Seek"操作。

改用xz格式:
7z a a.xz file
它必须支持所有模式。

And

7-Zip认为它需要归档名称。
因此,您可以指定一些 归档名称,例如a.xz

指定-an开关。

最终解决方案是:

cat foo.txt | 7za a -an -txz -bd -si -so | dd of=foo.xz

一个错误报告建议将此放在帮助中:

当前版本的7-Zip仅支持从stdin读取xz、lzma、tar、gzip和bzip2存档,并仅为7z、xz、gzip和bzip2存档添加来自stdin的文件。


0

当将 stdout 管道传递给 7zip 时,我遇到了类似的问题。

与其直接从 Process 调用命令,我将命令写入批处理文件,然后运行批处理文件。这是一个hack,但确实可行。


0

你可能需要使用7z下载页面上的“命令行版本”7za.exe。我看到你目前正在使用7z.exe,我很确定这是我以前遇到过的问题。


实际上,我认为我因为7z给我的麻烦而切换到了PeaZip。PeaZip是7z和其他几个压缩实用程序的包装器,并且PeaZip具有更好的命令行界面。


3
@ Mark:7za 是 7z 的精简版本(不支持一些归档类型),而 7z 是 7-Zip 的命令行版本(支持相同的归档类型)。 - Drosophila

0
最简单的方法是使用 xz,默认情况下使用与 7-zip 相同的压缩算法,并且使用 -T0 参数,这使得 xz 自动适应您的 CPU 核心数量进行多线程扩展,速度与 7-zip 一样快。 some_command | xz -T0 > some_file.xz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接