2

我收到错误“未实施”。

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

% 回声富 | 7z 一个虚拟 -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

4 回答 4

4

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

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

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

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

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

于 2009-08-17T13:02:27.033 回答
1

这是来自 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

伊戈尔巴甫洛夫 说

7z a a.7z -so

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

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

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

指定 -an 开关。

最终的解决方案是:

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

错误报告表明这应该在帮助中:

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

于 2016-04-25T20:47:56.347 回答
0

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


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

于 2009-08-17T11:29:25.127 回答
0

我在管道时遇到了类似的stdout问题7zip

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

于 2015-06-18T15:46:58.913 回答