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.

Foi útil?

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

Igor Pavlov diz :

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.

E

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top