Não é capaz de usar 7-Zip para stdin compressa e saída com stdout?
Pergunta
Eu recebo o erro "Não implementado".
Eu quero compactar um arquivo usando 7-Zip via stdin, em seguida, tomar o dados via stdout e fazer mais conversões com o meu pedido. No href="http://pwet.fr/man/linux/commandes/7z" rel="nofollow página homem mostra este exemplo:
% echo foo | 7z um manequim -tgzip -Si -então> / dev / null
Estou usando o Windows e C #.
Resultado:
7-Zip 4.65 Copyright (c) 1999-2009 Igor Pavlov 2009-02-03
Creating archive StdOut
System error:
Not implemented
Código:
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();
}
Existe outra maneira simples de ler o arquivo na memória?
Agora eu posso 1) gravação para um arquivo temporário e ler (fácil e pode copiar / colar algum código) 2) usar um tubo de arquivo (médio? Eu nunca fiz isso) 3) Algo mais.
Solução
Você pode querer experimentar algo como SevenZipSharp http://www.codeplex.com/sevenzipsharp, eu nunca usei pessoalmente, mas ele fornece um wrapper para a biblioteca cOM 7za.dll que pode ser útil para você.
Eu escrevi utilitários que utilizam 7-Zip através de um processo de mim mesmo e não tiveram problemas apesar de eu nunca tentei fazer StdIn e StdOut coisas. Nos ficheiros de ajuda que tenho com a minha versão do 7-Zip a página sobre os estados de comutação -si:
Nota: A versão atual do 7-Zip não suporta a leitura de arquivos de stdin
.
Nota certeza se isso pode ser a fonte do problema, com especificando muda pode ser confuso 7-Zip.
Os exemplos que mostram na ajuda parecem mostrar que -então é usado para redirecionar a saída para fora padrão, mas requer entradas base de arquivo normais para fazê-lo.
Outras dicas
Veja aqui algumas informações de Igor Pavlov (autor do 7z), em uma discussão sobre "7zip como um substituto para gzip / bzip2?"
A sugestão era usar basicamente 7z como um substituto xz
. Basta usar xz
deve funcionar, mas pode não ser multi-threaded (e 7z pode ser).
Ao tentar usar 7z como em:
somecommand | 7zr a -si -so | nc -q 2 1.2.3.4 5678
7z um a.7z -então
e
7z e a.7z -Si
não pode ser implemeted. desde .7z formato exige "Seek" operação.Use formato xz vez:
7z um arquivo a.xz
deve apoiar todos os modos.
7-Zip pensa que ele precisa de nome de arquivo.
Então você pode especificar alguns nome do arquivo como a.xz
ou
especifique interruptor -um.
A solução final era:
cat foo.txt | 7za a -an -txz -bd -si -so | dd of=foo.xz
Um relatório de bug sugere que esta deve ser na ajuda:
A versão atual da leitura suporte 7-Zip de arquivos de stdin apenas para XZ, LZMA, tar, gzip e bzip2 arquivos, e adicionando arquivos a partir de stdin apenas para 7z, XZ, gzip e bzip2 arquivos.
Você pode precisar usar 7za.exe
, que é a "versão Commandline" na href="http://www.7-zip.org/download.html" rel="nofollow noreferrer"> 7z página de download . Vejo que você está usando atualmente 7z.exe
, e eu tenho certeza que isso é um problema que eu encontrei antes também.
Na verdade, eu acho que eu mudei para PeaZip por causa dos problemas 7z estava me dando. PeaZip é uma 7z invólucro em torno e alguns outros utilitários de compressão, e PeaZip tem um pouco melhor interface de linha de comando.
Eu tive um problema semelhante quando tubulação stdout
em 7zip
Em vez de invocar o comando de Process
diretamente, eu escrevo o comando para um arquivo de lote e, em seguida, executar o arquivo em lotes. É um truque, mas ela não funciona.