Не можете использовать 7-Zip для сжатия stdin и вывода с помощью stdout?
Вопрос
Я получаю сообщение об ошибке "Не реализовано".
Я хочу сжать файл, используя 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
непосредственно я записываю команду в пакетный файл, а затем запускаю пакетный файл.Это взлом, но он действительно работает.