Domanda

ottengo l'errore "Non implementato".

Voglio comprimere un file utilizzando 7-Zip tramite stdin poi prendere la dati tramite stdout e fare di più conversioni con la mia domanda. Nella pagina uomo mostra questo esempio:

% echo foo | 7z un manichino -tgzip -si -così> / dev / null

Sto usando Windows e C #.

Risultati:

7-Zip 4.65  Copyright (c) 1999-2009 Igor Pavlov  2009-02-03
Creating archive StdOut

System error:
Not implemented

Codice:

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();
}

C'è un altro modo semplice per leggere il file nella memoria?

In questo momento riesco a 1) scrivere su un file temporaneo e leggere (facile e posso copiare / incollare del codice) 2) utilizzare un tubo di file (medium? Non ho mai fatto) 3) Qualcos'altro.

È stato utile?

Soluzione

Si potrebbe desiderare di provare qualcosa di simile SevenZipSharp http://www.codeplex.com/sevenzipsharp, non ho mai usato personalmente ma fornisce un wrapper per la libreria COM 7za.dll che può essere utile a voi.

ho scritto utilità che utilizzare 7-Zip tramite un processo di me stesso e non hanno avuto problemi se non ho mai provato a fare StdIn e StdOut roba. Nelle file della Guida che ho con la mia versione di 7-Zip pagina sugli stati di commutazione -si:

  

. Nota: La versione corrente di 7-Zip non supporta la lettura di archivi da stdin

Si noti sicuro se questo potrebbe essere la causa del problema, con entrambi gli interruttori specificando che potrebbe essere fonte di confusione 7-Zip.

Gli esempi che mostrano nella guida sembrano dimostrare che -così viene utilizzato per reindirizzare l'output in maniera standard, ma richiede normali ingressi basati su file per farlo.

Altri suggerimenti

Ecco alcune informazioni da Igor Pavlov (autore di 7z), in un thread su "7zip come una sostituzione drop-in per gzip / bzip2?"

Il suggerimento era quella di utilizzare praticamente 7z come un surrogato di xz. Usando solo xz dovrebbe funzionare, ma non può essere multi-threaded (e 7z può essere).

Durante il tentativo di utilizzare 7z come in:

somecommand | 7zr a -si -so | nc -q 2 1.2.3.4 5678

Igor Pavlov dice :

  

7z un a.7z -così
  e
  7z e a.7z -si
  non può essere implemeted. poiché .7z formato richiede   "Seek" operazione.

     

Usa formato XZ invece:
  7z un file a.xz
  esso deve supportare tutte le modalità.

E

  

7-Zip pensa che ha bisogno di nome dell'archivio.
  Così si può specificare alcune   nome dell'archivio come a.xz
  o
  specificare interruttore -an.

La soluzione finale è stata:

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

un bug report suggerisce questo dovrebbe essere nella guida:

  

La versione corrente di lettura sostegno 7-Zip degli archivi da stdin solo per gli archivi XZ, LZMA, tar, gzip e bzip2, e l'aggiunta di file da stdin solo per 7z, XZ, gzip e bzip2 archivi.

Potrebbe essere necessario utilizzare 7za.exe, che è la "versione Commandline" sul href="http://www.7-zip.org/download.html" rel="nofollow noreferrer"> 7z pagina . Vedo che si sta utilizzando 7z.exe, e sono abbastanza sicuro che è un problema che ho incontrato prima di pure.


In realtà, penso che sono passato a
PeaZip a causa dei problemi 7z mi stava dando. PeaZip è un wrapper 7z e poche altre utilità di compressione, e PeaZip ha un po 'meglio l'interfaccia a riga di comando.

Mi sono imbattuto in un problema simile quando tubazioni stdout in 7zip

Invece di invocare il comando dalla Process direttamente, scrivo il comando in un file batch e quindi eseguire il file batch. Si tratta di un hack, ma funziona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top