Не можете использовать 7-Zip для сжатия стандартного ввода и вывода на стандартный вывод?

Получаю ошибку "Не реализовано".

Я хочу сжать файл с помощью 7-Zip через стандартный ввод, а затем взять данные через стандартный вывод и делать больше конверсий с моим приложением. На справочной странице показан следующий пример:

% echo foo | 7z манекен -tgzip -si -so > /dev/null

Я использую Windows и С#.

Полученные результаты:

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) Что-то еще.


person Community    schedule 17.08.2009    source источник


Ответы (4)


Вы можете попробовать что-то вроде SevenZipSharp http://www.codeplex.com/sevenzipsharp, я никогда не использовал его лично, но он предоставляет оболочку для COM-библиотеки 7za.dll, которая может быть вам полезна.

Я сам писал утилиты, которые используют 7-Zip через процесс, и у меня не было проблем, хотя я никогда не пытался делать вещи StdIn и StdOut. В файлах справки, которые у меня есть с моей версией 7-Zip, на странице с переключателем -si указано:

Примечание. Текущая версия 7-Zip не поддерживает чтение архивов со стандартного ввода.

Обратите внимание, что если это может быть источником вашей проблемы, указание обоих переключателей может привести к путанице 7-Zip.

Примеры, которые они показывают в справке, похоже, показывают, что -so используется для перенаправления вывода на стандартный вывод, но для этого требуются обычные входные данные на основе файлов.

person RobV    schedule 17.08.2009

Вот некоторая информация от Игоря Павлова (автора 7z) в ветке о "7zip как вставная замена для 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 требует операции «Поиск».

Вместо этого используйте формат 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.

person Xen2050    schedule 25.04.2016

Возможно, вам придется использовать 7za.exe, которая является «версией командной строки» на странице загрузки 7z. Я вижу, что вы в настоящее время используете 7z.exe, и я уверен, что это проблема, с которой я сталкивался и раньше.


На самом деле, я думаю, что переключился на PeaZip из-за проблем, которые доставлял мне 7z. PeaZip — это оболочка для 7z и нескольких других утилит сжатия, и у PeaZip немного лучший интерфейс командной строки.

person Mark Rushakoff    schedule 17.08.2009
comment
@ Mark: 7za — это сокращенная версия 7z (отказывается от поддержки некоторых типов архивов), 7z — это версия командной строки 7-Zip (поддерживает те же типы архивов). - person Drosophila; 25.04.2010

Я столкнулся с похожей проблемой при подключении stdout к 7zip.

Вместо прямого вызова команды из Process я записываю команду в пакетный файл, а затем запускаю пакетный файл. Это хак, но он работает.

person Brian    schedule 18.06.2015