Frage

Ich erhalte die Fehlermeldung "Nicht implementiert".

Ich möchte eine Datei komprimieren mit 7-Zip über stdin dann nehmen die Daten über stdout und tun mehr Conversions mit meiner Anwendung. In dem Manpage es dieses Beispiel zeigt:

% echo foo | 7z ein Dummy -tgzip -si -so> / dev / null

ich Windows und C # verwenden.

Ergebnisse:

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

System error:
Not implemented

Code:

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

Gibt es eine andere einfache Möglichkeit, die Datei in den Speicher zu lesen?

Im Moment kann ich 1) in eine temporäre Datei schreiben und lesen (einfach und kann Kopieren / einige Code einfügen) 2) verwenden, um eine Datei Leitung (Medium? Ich habe es nie getan) 3) etwas anderes.

War es hilfreich?

Lösung

Vielleicht möchten Sie etwas ausprobieren wie SevenZipSharp http://www.codeplex.com/sevenzipsharp, habe ich es nie persönlich in Anspruch genommen, aber es einen Wrapper zur 7za.dll COM-Bibliothek zur Verfügung, die Sie nützlich sein kann.

Ich habe Dienstprogramme geschrieben, die 7-Zip über einen Prozess selbst zu nutzen und haben keine Probleme hatte, obwohl ich nie habe versucht StdIn und StdOut Sachen zu tun. In den Hilfedateien Ich habe mit meiner Version von 7-Zip der Seite auf den -si Schaltzuständen:

  

. Hinweis: Die aktuelle Version von 7-Zip unterstützt nicht das Lesen von Archiven von stdin

Beachten Sie sicher, ob dies die Ursache des Problems sein, mit Angabe beiden Schalter könnte es 7-Zip verwirrend sein.

Die Beispiele, die sie in der Hilfe zeigen, scheinen zu zeigen, dass -so verwendet wird, um die Ausgabe an die Standardausgabe zu umleiten, sondern erfordert normale Datei basierte Eingaben, dies zu tun.

Andere Tipps

Hier einige Informationen von Igor Pavlov (7z des Autors), in einem Thread über "7zip als Drop-in-Ersatz für gzip / bzip2?"

Der Vorschlag war im Grunde 7z als xz Ersatz zu verwenden. Nur mit xz sollte funktionieren, aber es kann nicht multi-threaded sein (und 7z sein kann).

Beim Versuch, 7z zu verwenden, wie in:

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

Igor Pavlov sagt :

  

7z ein a.7z -so
  und
  7z e a.7z -si
  kann nicht implemeted werden. da .7z Format erfordert   "Suche" Betrieb.

     

Verwenden XZ-Format statt:
  7z eine a.xz Datei
  es müssen alle Modi unterstützen.

Und

  

7-Zip denkt, dass es Archivname muss.
  So können Sie einige angeben   Archivnamen wie a.xz
  oder in   angeben -an-Schalter.

Die Lösung war,:

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

Ein Bug-Report dies legt nahe, in der Hilfe sein soll:

  

Die aktuelle Version von 7-Zip Unterstützung Lesen von Archiven von stdin nur für xz, lzma, tar, gzip und bzip2-Archive und das Hinzufügen von Dateien von stdin nur für 7z, xz, gzip und bzip2-Archive.

Sie müssen möglicherweise 7za.exe verwenden, die die „Commandline Version“ auf der 7z Download-Seite . Ich sehe, dass Sie gerade verwenden 7z.exe sind, und ich bin mir ziemlich sicher, das ist ein Problem, das mir vor als auch begegnet ist.


Eigentlich, denke ich, ich wechselte zu PeaZip wegen der Schwierigkeiten 7z mir gab. PeaZip ist ein Wrapper um 7z und ein paar anderen Komprimierungsprogramme, und PeaZip hat ein wenig besser Kommandozeilen-Schnittstelle.

Ich lief in ein ähnliches Problem, wenn stdout in 7zip kochend

Statt den Befehls von Process Aufruf direkt, schreibe ich den Befehl zu einer Batch-Datei und dann die Batchdatei ausführen. Es ist ein Hack, aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top