【问题标题】:Not able to use 7-Zip to compress stdin and output with stdout?无法使用 7-Zip 压缩标准输入并使用标准输出输出?
【发布时间】:2010-11-20 05:14:21
【问题描述】:

我收到错误“未实施”。

我想通过标准输入使用7-Zip 压缩文件,然后通过标准输出获取数据并使用我的应用程序进行更多转换。在man page 中显示了这个例子:

% 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) 别的。

【问题讨论】:

    标签: c# stdout stdin 7zip


    【解决方案1】:

    您可能想尝试一下 SevenZipSharp http://www.codeplex.com/sevenzipsharp 之类的东西,我从未亲自使用过它,但它为 7za.dll COM 库提供了一个包装器,可能对您有所帮助。

    我自己编写了通过一个进程使用 7-Zip 的实用程序,尽管我从未尝试过 StdIn 和 StdOut 的东西,但没有遇到任何问题。在我的 7-Zip 版本的帮助文件中,-si 开关状态的页面:

    注意:当前版本的 7-Zip 不支持从标准输入读取档案。

    请注意确定这是否是问题的根源,同时指定两个开关可能会使 7-Zip 混淆。

    他们在帮助中显示的示例似乎表明 -so 用于将输出重定向到标准输出,但需要基于正常文件的输入才能这样做。

    【讨论】:

      【解决方案2】:

      这是来自 Igor Pavlov(7z 的作者)的一些信息,在一个关于 "7zip as a drop-in replacement for gzip/bzip2?" 的帖子中

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

      在尝试使用 7z 时:

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

      Igor Pavlov says:

      7z a.7z -so

      7z e a.7z -si
      无法实现。因为 .7z 格式需要 “寻找”操作。

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

      And

      7-Zip 认为它需要存档名称。
      所以你可以指定一些 存档名称,例如 a.xz

      指定 -an 开关。

      最终的解决方案是:

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

      A bug report 建议这应该在帮助中:

      当前版本的 7-Zip 支持从标准输入读取档案,仅适用于 xz、lzma、tar、gzip 和 bzip2 档案,并仅支持从标准输入添加文件适用于 7z、xz、gzip 和 bzip2 档案。

      【讨论】:

        【解决方案3】:

        您可能需要使用7za.exe,这是7z download page 上的“命令行版本”。我看到您目前正在使用7z.exe,我很确定这也是我之前遇到的问题。


        实际上,我想我切换到PeaZip 是因为 7z 给我带来的麻烦。 PeaZip 是 7z 和一些其他压缩实用程序的包装器,PeaZip 具有更好的命令行界面。

        【讨论】:

        • @Mark: 7za 是 7z 的精简版(放弃了对某些存档类型的支持),7z 是 7-Zip 的命令行版本(支持相同的存档类型)。
        【解决方案4】:

        我在将stdout 输送到7zip 时遇到了类似的问题

        我没有直接从Process 调用命令,而是将命令写入批处理文件,然后运行该批处理文件。这是一个 hack,但它确实有效。

        【讨论】: