不能使用7-Zip来压缩标准输出并使用标准输出输出?

时间:2009-08-17 11:12:31

标签: c# stdout stdin 7zip

我收到错误“未实施”。

我想通过stdin使用7-Zip压缩文件,然后通过stdout获取数据并对我的应用程序进行更多转换。在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)其他东西。

4 个答案:

答案 0 :(得分:3)

你可能想试试像SevenZipSharp http://www.codeplex.com/sevenzipsharp这样的东西,我从来没有亲自使用它,但是它为7za.dll COM库提供了一个可能对你有用的包装。

我已经编写了自己使用7-Zip的实用程序,虽然我从来没有尝试过StdIn和StdOut的东西但是没有问题。在我的7-Zip版本的帮助文件中,-si开关上的页面显示:

  

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

请注意,如果这可能是您问题的根源,指定两个开关可能会让7-Zip感到困惑。

它们在帮助中显示的示例似乎表明-so用于将输出重定向到标准输出,但需要基于文件的常规输入才能执行此操作。

答案 1 :(得分:1)

以下是来自Igor Pavlov(7z&#39作者)的一些信息,关于"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 a.7z -so
  和
  7z e a.7z -si
  无法实施。因为.7z格式需要   "寻求"操作

     

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

And

  

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

最终的解决方案是:

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

A bug report表明这应该在帮助中:

  

当前版本的7-Zip支持从stdin读取档案,仅用于xz,lzma,tar,gzip和bzip2档案,以及仅为7z,xz,gzip和bzip2档案添加stdin文件。

答案 2 :(得分:0)

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

<小时/> 实际上,我认为由于7z给我带来的麻烦,我转而PeaZip。 PeaZip是7z和一些其他压缩实用程序的包装器,PeaZip有一个更好的命令行界面。

答案 3 :(得分:0)

在将stdout加入7zip

时遇到了类似的问题

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