غير قادر على استخدام 7-zip لضغط stdin والإخراج مع stdout؟

StackOverflow https://stackoverflow.com/questions/1287383

  •  18-09-2019
  •  | 
  •  

سؤال

أحصل على الخطأ "غير مطبق".

أريد ضغط ملف باستخدام 7-zip عبر Stdin ثم تأخذ البيانات عبر Stdout وفعل المزيد من التحويلات مع طلبي. في ال رجل صفحة إنه يظهر هذا المثال:

٪ Echo Foo | 7z دمية -tgzip -si -so> / dev / null

أنا أستخدم Windows و C #.

نتائج:

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

System error:
Not implemented

رمز:

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

هل هناك طريقة أخرى بسيطة لقراءة الملف في الذاكرة؟

الآن يمكنني 1) اكتب إلى ملف مؤقت وقراءة (سهل ويمكن نسخ / لصق بعض الكود) 2) استخدام أنبوب الملف (متوسط؟ لم أفعل ذلك أبدا) 3) شيء آخر.

هل كانت مفيدة؟

المحلول

قد ترغب في تجربة شيء مثل sevenzipsharp http://www.codeplex.com/sevenzipsharp., ، لم أستخدمها شخصيا أبدا، لكنها توفر غلافا لمكتبة COM 7za.dll التي قد تكون مفيدة لك.

لقد كتبت المرافق التي تستخدم 7 zip عن طريق عملية نفسي ولن تواجه مشكلات على الرغم من أنني لم أحاول أبدا القيام بأشياء Stdin و Stdout. في ملفات التعليمات لدي مع الإصدار من 7-zip الصفحة الموجودة على تحويل التبديل -SI:

ملاحظة: الإصدار الحالي من 7-Zip لا يدعم قراءة المحفوظات من Stdin.

نتأكد من أنه إذا كان هذا قد يكون مصدر مشكلتك، مع تحديد كلا المفتاحين قد يكون مربكا 7-zip.

يبدو أن الأمثلة التي تظهر في المساعدة تظهر أنه يتم استخدامها على إعادة توجيه الإخراج إلى القياسية ولكنها تتطلب المدخلات المستندة إلى الملفات الطبيعية للقيام بذلك.

نصائح أخرى

إليك بعض المعلومات من إيغور بافلوف (مؤلف 7Z)، في موضوع حول "7zip كبديل قطرة ل gzip / bzip2؟"

وكان الاقتراح استخدام 7Z أساسا ك xz بديل. فقط باستخدام xz يجب أن تعمل، ولكن قد لا يكون متعدد الخيوط (و 7Z قد يكون).

أثناء محاولة استخدام 7Z كما في:

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

يقول إيغور بافلوف:

7Z A A.7Z -So
و
7Z E A.7Z -SI
لا يمكن أن يتم تنفيذه. منذ تنسيق .7z يتطلب عملية "البحث".

استخدم تنسيق XZ بدلا من ذلك:
7Z ملف A.XZ
يجب أن تدعم جميع الأوضاع.

و

7-zip يعتقد أنه يحتاج إلى اسم الأرشيف.
حتى تتمكن من تحديد اسم الأرشيف مثل A.XZ
أو
حدد مفتاح التبديل.

الحل النهائي كان:

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

تقرير الأخطاء يقترح أن يكون هذا في المساعدة:

الإصدار الحالي من 7-zip دعم قراءة أرشيف من Stdin فقط لأجهزة XZ و LZMA و TAR و GZIP و BZIP2 وإضافة ملفات من أرشيفات Stdin فقط ل 7Z و XZ و Gzip و BZIP2.

قد تحتاج إلى استخدام 7za.exe, ، وهذا هو "إصدار Commandline" على 7Z تنزيل الصفحة. وبعد أرى أنك تستخدم حاليا 7z.exe, أنا متأكد من أن هذه مشكلة واجهتها من قبل أيضا.


في الواقع، أعتقد أنني تحولت إلى Peazip. بسبب المشاكل 7Z كان يعطيني. Peazip عبارة عن مجمع حول 7Z وعدد قليل من مرافق ضغط أخرى، وواجهة Peazip أفضل واجهة سطر الأوامر أفضل قليلا.

ركضت مشكلة مماثلة عند الأنابيب stdout إلى 7zip

بدلا من استدعاء الأمر من Process مباشرة، أكتب الأمر إلى ملف دفعي ثم قم بتشغيل ملف الدفعات. إنه اختراق، لكنه يعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top