Question

Je reçois l'erreur "Non implémenté".

Je veux compresser un fichier en utilisant 7-Zip via stdin puis prendre la données via stdout et faire plus de conversions avec ma demande. Dans le page man il montre cet exemple:

% echo foo | 7z un mannequin -tgzip -si -SO> / dev / null

J'utilise Windows et C #.

Résultats:

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

Y at-il une autre façon simple de lire le fichier en mémoire?

En ce moment je peux 1) écrire dans un fichier temporaire et lire (facile et puis copier / coller du code) 2) utiliser un tuyau de fichier (moyen? Je l'ai jamais fait) 3) Quelque chose d'autre.

Était-ce utile?

La solution

Vous pouvez essayer quelque chose comme SevenZipSharp http://www.codeplex.com/sevenzipsharp, je ne l'ai jamais utilisé personnellement, mais il fournit une enveloppe à la bibliothèque 7za.dll COM qui peut être utile pour vous.

J'ai écrit les services publics qui utilisent 7-Zip par un processus moi-même et n'ont pas eu des problèmes si je ne l'ai jamais essayé de faire des choses StdIn et StdOut. Dans les fichiers d'aide que j'ai avec ma version de 7-Zip la page sur les états de commutation -si:

  

Note:. La version actuelle de 7-Zip ne prend pas en charge la lecture des archives de stdin

Notez que si cela pourrait être la source de votre problème, avec les deux commutateurs spécifiant qu'il pourrait être source de confusion 7-Zip.

Les exemples qu'ils montrent à l'aide semblent montrer que -SO est utilisé pour rediriger la sortie vers la sortie standard, mais nécessite des entrées à base de fichiers normaux de le faire.

Autres conseils

Voici quelques informations d'Igor Pavlov (l'auteur de 7z), dans une discussion sur "7zip en remplacement de drop-in pour gzip / bzip2?"

Il a été suggéré d'utiliser essentiellement 7z comme substitut de xz. Juste en utilisant xz devrait fonctionner, mais il ne peut pas être multi-thread (et 7z peut être).

En essayant d'utiliser 7z comme dans:

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

Igor Pavlov dit :

  

7z un a.7z -SO
  et
  7z e a.7z -si
  ne peut pas être implemeted. depuis .7z format nécessite   opération "Chercher".

     

Utilisez le format XZ au lieu:
  7z un fichier a.xz
  il doit prendre en charge tous les modes.

Et

  

7-Zip pense qu'il a besoin de nom de l'archive.
  Ainsi, vous pouvez spécifier certains   nom de l'archive comme a.xz
  ou
  spécifiez interrupteur -an.

La solution finale était:

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

Un rapport de bogue suggère cela devrait être dans l'aide:

  

La version actuelle de la lecture de support 7-Zip des archives de stdin seulement pour XZ, lzma, goudron, archives gzip et bzip2, et l'ajout de fichiers à partir stdin uniquement pour 7z, XZ, archives gzip et bzip2.

Vous devrez peut-être utiliser 7za.exe, qui est la "version Commandline" sur le 7z page de téléchargement . Je vois que vous utilisez actuellement 7z.exe, et je suis sûr que ce un problème que je l'ai rencontré aussi bien avant.


En fait, je pense que je suis passé à PeaZip en raison des troubles 7z me donne. PeaZip est une enveloppe autour 7z et quelques autres utilitaires de compression et PeaZip a un peu mieux l'interface de ligne de commande.

Je suis tombé sur un problème similaire lorsque la tuyauterie stdout dans 7zip

Au lieu d'invoquer la commande de Process directement, j'écris la commande dans un fichier batch, puis exécutez le fichier batch. Il est un hack, mais il fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top