سؤال

كيف يمكنني إنشاء أرشيفات 7-Zip من تطبيق وحدة التحكم C# الخاص بي؟أحتاج إلى أن أكون قادرًا على استخراج الأرشيفات باستخدام الملفات العادية والمتاحة على نطاق واسع 7-الرمز البريدي برنامج.


فيما يلي نتائجي مع الأمثلة المقدمة كإجابات على هذا السؤال

  • "القصف" إلى 7z.exe - هذا هو الأسلوب الأبسط والأكثر فعالية، ويمكنني أن أؤكد ذلك أنه يعمل بشكل جيد.مثل يذكر Workmad3, ، أنا فقط بحاجة إلى ضمان تثبيت 7z.exe على جميع الأجهزة المستهدفة، وهو أمر يمكنني ضمانه.
  • 7Zip في ضغط الذاكرة - يشير هذا إلى ضغط ملفات تعريف الارتباط "في الذاكرة" قبل إرسالها إلى العميل؛تبدو هذه الطريقة واعدة إلى حد ما.طرق التغليف (تغليف LZMA SDK) نوع الإرجاع byte[].عندما أكتب byte[] إلى ملف، لا يمكنني استخراجه باستخدام 7-Zip (File.7z is not supported archive).
  • 7zشارب الغلاف (الموجود في CodePlex) - يلتف هذا الملف 7z exe/LZMA SDK.لقد قمت بالإشارة إلى المشروع من تطبيقي، ونجح في إنشاء بعض ملفات الأرشيف، لكنني لم أتمكن من استخراج الملفات باستخدام برنامج 7-Zip العادي (File.7z is not supported archive).
  • 7Zip SDK المعروف أيضًا باسم LZMA SDK - أعتقد أنني لست ذكيًا بما يكفي لمعرفة كيفية استخدام هذا (وهذا هو سبب نشري هنا)...هل هناك أي أمثلة على أكواد العمل توضح إنشاء أرشيف 7zip يمكن استخراجه بواسطة برنامج 7zip العادي؟
  • واجهة CodeProject C# (.NET) لملفات DLL الخاصة بأرشيف 7-Zip - يدعم فقط الاستخراج من أرشيفات 7zip...أحتاج إلى إنشائهم!
  • SharpZipLib - وفقا لمن التعليمات, ، SharpZipLib لا يدعم 7zip.
هل كانت مفيدة؟

المحلول

إذا كان بإمكانك ضمان تثبيت تطبيق 7-zip (وفي المسار) على جميع الأجهزة المستهدفة، فيمكنك إلغاء التحميل عن طريق الاتصال بتطبيق سطر الأوامر 7z.ليس الحل الأكثر أناقة ولكنه الأقل عملاً.

نصائح أخرى

مثال على ملف تعريف الارتباط EggCafe 7Zip هذا مثال (ملف تعريف الارتباط المضغوط) مع DLL الخاص بـ 7Zip.

غلاف CodePlexهذا مشروع مفتوح المصدر يقوم بتشويه وظيفة الضغط لـ 7z.

7Zip SDK SDK الرسمي لـ 7zip (C، C++، C#، Java) <---اقتراحي

مكتبة .Net المضغوطة بواسطة SharpDevelop.net

CodeProject مثال مع 7zip

SharpZipLib العديد من السوستة

SevenZipSharp هو حل آخر.إنشاء أرشيفات بصيغة 7zip...

فيما يلي مثال عملي كامل باستخدام SevenZip SDK في C#.

سيقوم بكتابة وقراءة ملفات 7zip القياسية كما تم إنشاؤها بواسطة تطبيق Windows 7zip.

ملاحظة.المثال السابق لم يكن سيتم فك الضغط أبدًا لأنه لم يكتب أبدًا معلومات الخاصية المطلوبة في بداية الملف.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SevenZip.Compression.LZMA;
using System.IO;
using SevenZip;

namespace VHD_Director
{
    class My7Zip
    {
        public static void CompressFileLZMA(string inFile, string outFile)
        {
            Int32 dictionary = 1 << 23;
            Int32 posStateBits = 2;
            Int32 litContextBits = 3; // for normal files
            // UInt32 litContextBits = 0; // for 32-bit data
            Int32 litPosBits = 0;
            // UInt32 litPosBits = 2; // for 32-bit data
            Int32 algorithm = 2;
            Int32 numFastBytes = 128;

            string mf = "bt4";
            bool eos = true;
            bool stdInMode = false;


            CoderPropID[] propIDs =  {
                CoderPropID.DictionarySize,
                CoderPropID.PosStateBits,
                CoderPropID.LitContextBits,
                CoderPropID.LitPosBits,
                CoderPropID.Algorithm,
                CoderPropID.NumFastBytes,
                CoderPropID.MatchFinder,
                CoderPropID.EndMarker
            };

            object[] properties = {
                (Int32)(dictionary),
                (Int32)(posStateBits),
                (Int32)(litContextBits),
                (Int32)(litPosBits),
                (Int32)(algorithm),
                (Int32)(numFastBytes),
                mf,
                eos
            };

            using (FileStream inStream = new FileStream(inFile, FileMode.Open))
            {
                using (FileStream outStream = new FileStream(outFile, FileMode.Create))
                {
                    SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder();
                    encoder.SetCoderProperties(propIDs, properties);
                    encoder.WriteCoderProperties(outStream);
                    Int64 fileSize;
                    if (eos || stdInMode)
                        fileSize = -1;
                    else
                        fileSize = inStream.Length;
                    for (int i = 0; i < 8; i++)
                        outStream.WriteByte((Byte)(fileSize >> (8 * i)));
                    encoder.Code(inStream, outStream, -1, -1, null);
                }
            }

        }

        public static void DecompressFileLZMA(string inFile, string outFile)
        {
            using (FileStream input = new FileStream(inFile, FileMode.Open))
            {
                using (FileStream output = new FileStream(outFile, FileMode.Create))
                {
                    SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();

                    byte[] properties = new byte[5];
                    if (input.Read(properties, 0, 5) != 5)
                        throw (new Exception("input .lzma is too short"));
                    decoder.SetDecoderProperties(properties);

                    long outSize = 0;
                    for (int i = 0; i < 8; i++)
                    {
                        int v = input.ReadByte();
                        if (v < 0)
                            throw (new Exception("Can't Read 1"));
                        outSize |= ((long)(byte)v) << (8 * i);
                    }
                    long compressedSize = input.Length - input.Position;

                    decoder.Code(input, output, compressedSize, outSize, null);
                }
            }
        }

        public static void Test()
        {
            CompressFileLZMA("DiscUtils.pdb", "DiscUtils.pdb.7z");
            DecompressFileLZMA("DiscUtils.pdb.7z", "DiscUtils.pdb2");
        }
    }
}

لقد استخدمت SDK.

على سبيل المثال:

using SevenZip.Compression.LZMA;
private static void CompressFileLZMA(string inFile, string outFile)
{
   SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();

   using (FileStream input = new FileStream(inFile, FileMode.Open))
   {
      using (FileStream output = new FileStream(outFile, FileMode.Create))
      {
          coder.Code(input, output, -1, -1, null);
          output.Flush();
      }
   }
}
 string zipfile = @"E:\Folderx\NPPES.zip";
 string folder = @"E:\TargetFolderx";

 ExtractFile(zipfile,folder);
public void ExtractFile(string source, string destination)
        {
            // If the directory doesn't exist, create it.
            if (!Directory.Exists(destination))
                Directory.CreateDirectory(destination);

            //string zPath = ConfigurationManager.AppSettings["FileExtactorEXE"];
          //  string zPath = Properties.Settings.Default.FileExtactorEXE; ;

            string zPath=@"C:\Program Files\7-Zip\7zG.exe";

            try
            {
                ProcessStartInfo pro = new ProcessStartInfo();
                pro.WindowStyle = ProcessWindowStyle.Hidden;
                pro.FileName = zPath;
                pro.Arguments = "x \"" + source + "\" -o" + destination;
                Process x = Process.Start(pro);
                x.WaitForExit();
            }
            catch (System.Exception Ex) { }
        }

ما عليك سوى تثبيت 7 zip من المصدر وتمرير المعلمة إلى الطريقة.

شكرًا.من فضلك مثل الجواب.

أنا استخدم هذا الرمز

                string PZipPath = @"C:\Program Files\7-Zip\7z.exe";
                string sourceCompressDir = @"C:\Test";
                string targetCompressName = @"C:\Test\abc.zip";
                string CompressName = targetCompressName.Split('\\').Last();
                string[] fileCompressList = Directory.GetFiles(sourceCompressDir, "*.*");

                    if (fileCompressList.Length == 0)
                    {
                        MessageBox.Show("No file in directory", "Important Message");
                        return;
                    }
                    string filetozip = null;
                    foreach (string filename in fileCompressList)
                    {
                        filetozip = filetozip + "\"" + filename + " ";
                    }

                    ProcessStartInfo pCompress = new ProcessStartInfo();
                    pCompress.FileName = PZipPath;
                    if (chkRequestPWD.Checked == true)
                    {
                        pCompress.Arguments = "a -tzip \"" + targetCompressName + "\" " + filetozip + " -mx=9" + " -p" + tbPassword.Text;
                    }
                    else
                    {
                        pCompress.Arguments = "a -tzip \"" + targetCompressName + "\" \"" + filetozip + "\" -mx=9";
                    }
                    pCompress.WindowStyle = ProcessWindowStyle.Hidden;
                    Process x = Process.Start(pCompress);
                    x.WaitForExit();

أسهل طريقة هي العمل مع ملفات .zip بدلاً من .7z واستخدامها دوت نت الرمز البريدي

عند تشغيل أوامر 7zip للصدفة، كانت هناك مشكلات أخرى مثل امتيازات المستخدم، واجهت مشكلة مع SevenZipSharp.

Private Function CompressFile(filename As String) As Boolean
Using zip As New ZipFile()
    zip.AddFile(filename & ".txt", "")
    zip.Save(filename & ".zip")
End Using

Return File.Exists(filename & ".zip")
End Function

شاربكومبريس هي في رأيي واحدة من أذكى مكتبات الضغط المتوفرة.وهو يدعم LZMA (7-zip)، وهو سهل الاستخدام وقيد التطوير النشط.

نظرًا لأنه يدعم تدفق LZMA بالفعل، فإنه في وقت كتابة هذا التقرير، للأسف يدعم فقط قراءة أرشيف 7-zip.ولكن كتابة الأرشيف موجودة في قائمة المهام الخاصة بهم (انظر الملف التمهيدي).لقراء المستقبل:تحقق للحصول على الوضع الحالي هنا: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md

قم بتثبيت حزمة NuGet التي تسمى SevenZipSharp.Interop

ثم:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top