Не можете использовать 7-Zip для сжатия stdin и вывода с помощью stdout?

StackOverflow https://stackoverflow.com/questions/1287383

  •  18-09-2019
  •  | 
  •  

Вопрос

Я получаю сообщение об ошибке "Не реализовано".

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Вот некоторая информация от Игоря Павлова (автора 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 -так
и
7z e a.7z -si
не может быть реализован.поскольку формат .7z требует операции "Поиска".

Вместо этого используйте формат xz:
файл 7z a a.xz
он должен поддерживать все режимы.

И

7-Zip считает, что ему нужно имя архива.
Таким образом, вы можете указать некоторое имя архива, например.xz
или
укажите -переключатель.

Конечным решением было:

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

Сообщение об ошибке предполагает, что это должно быть в справке:

Текущая версия 7-Zip поддерживает чтение архивов из stdin только для архивов xz, lzma, tar, gzip и bzip2 и добавление файлов из stdin только для архивов 7z, xz, gzip и bzip2.

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


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

Я столкнулся с аналогичной проблемой при прокладке трубопровода stdout в 7zip

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top