.NET ile 7-Zip arşivlerini nasıl oluştururum?


102

C # konsol uygulamamdan 7-Zip arşivlerini nasıl oluşturabilirim? Arşivleri normal, yaygın olarak bulunabilen 7-Zip programını kullanarak çıkarabilmem gerekiyor .


İşte bu sorunun yanıtları olarak verilen örneklerle sonuçlarım

  • 7z.exe'ye "bombalama" - bu en basit ve en etkili yaklaşım ve iyi çalıştığını doğrulayabilirim . Gibi workmad3 bahseder , sadece 7Z.exe Ben garanti bir şeydir ki, tüm hedef makinelerde yüklü olduğunu garanti gerekir.
  • Hafıza sıkıştırmasında 7Zip - bu, istemciye gönderilmeden önce "bellek içi" tanımlama bilgilerini sıkıştırmayı ifade eder; bu yöntem biraz umut verici görünüyor. Sarmalayıcı yöntemleri ( LZMA SDK'yı sarma ) dönüş türü byte[]. Yazarken byte[]bir dosyaya dizi, 7-Zip kullanarak açamadı ( File.7z is not supported archive).
  • 7zSharp Wrapper (CodePlex'te bulunur) - bu, 7z exe / LZMA SDK'yı sarar . Projeye uygulamamdan referans verdim ve bazı arşiv dosyalarını başarıyla oluşturdu, ancak dosyaları normal 7-Zip programını ( File.7z is not supported archive) kullanarak çıkaramadım .
  • 7Zip SDK aka LZMA SDK - Sanırım bunu nasıl kullanacağımı anlayacak kadar zeki değilim (bu yüzden buraya gönderdim) ... normal 7zip programı?
  • 7-Zip Arşiv DLL'leri için CodeProject C # (.NET) Arayüzü - yalnızca 7zip arşivlerinden çıkarmayı destekler ... Bunları oluşturmam gerekiyor!
  • SharpZipLib - Sıkça Sorulan Sorulara göre SharpZipLib, 7zip'i desteklemiyor.

32
Tüm linkler aşağıdaki yazımdan geldiğinde bunu Google'dan yazmayın. İnsanlara pek saygılı olmadı, size bazı çözümler aramak için zaman ayırdı.
Patrick Desjardins

3
Bu yazının eski olduğunu biliyorum, ancak bugün araştırmamda SevenZipSharp adlı bir proje gördüm. sevenzipsharp.codeplex.com
Timmerz

12
Gelecekteki okuyucular için sadece bir uyarı. SevenZipSharp yazılımdan vazgeçilmiş gibi görünüyor. Bugün itibariyle en son kararlı sürüm (0.64), Ağustos 2010'da bazı kötü çoklu okuma sorunları ile (hata raporlarına göre) piyasaya sürüldü. O zamandan beri yalnızca birkaç kaynak kodu kaydı yayınlandı.
Anttu

Yanıtlar:


28

7-zip uygulamasının tüm hedef makinelere yükleneceğini (ve yolda) garanti edebiliyorsanız, komut satırı uygulaması 7z'yi çağırarak boşaltabilirsiniz. En zarif çözüm değil ama en az iş.


7
Aslında 7z komut satırı yardımcı programını ikili dosyalarımızla gönderiyoruz ve ona kabuk gönderiyoruz. Bizim için gerçekten iyi çalışıyor.
David Mohundro

81

EggCafe 7Zip tanımlama bilgisi örneği Bu, 7Zip DLL dosyasıyla bir örnektir (sıkıştırılmış tanımlama bilgisi).

CodePlex Wrapper Bu, 7z'nin sıkıştırma işlevini çözen açık kaynaklı bir projedir.

7Zip SDK 7zip için resmi SDK (C, C ++, C #, Java) <--- Benim önerim

SharpDevelop.net tarafından .Net zip kitaplığı

7zip ile CodeProject örneği

SharpZipLib Birçok sıkıştırma


Bitti ve ben de yararlı bir açık kaynak proje ekledim.
Patrick Desjardins

1
LOL? Tanımlama bilgisini bir dizeyle değiştirin ... bir dosya veya her neyse ... lol?
Patrick Desjardins

1
Hayır, sadece çalışan bir örnek bulan var mı görmek istiyorum ... Araştırmanız için teşekkür ederim, ancak sağladığınız bağlantıların hiçbiri beni işe yarayan bir şeye yönlendiremedi.
Seibar

2
Hiçbirinin kopyalayıp yapıştırabileceğiniz bir kod olmadığını kabul etmeliyim. SDK, tüm yanıtlara sahip olanıdır, ancak işe yarayan bir şeye sahip olmak biraz zaman ve çaba gerektirir. Bunu yapmak istemediğini anlayabiliyorum. İyi günler.
Patrick Desjardins

3
Her neyse, SharpDevelop / SharpZipLib referanslarını kaldırmanızı öneririm, çünkü ikisi de aynı anlama geliyor ve 7-Zip'i desteklemiyorlar. Seibar açıkça 7z istedi. Ayrıca 7z çözümleri de arıyorum çünkü ShaprZipLib arşivle çalışmadı ve bu konuyu buldu. ShaprZipLib yanıltıcı bir ipucudur!
Onsokumaru

25

SevenZipSharp başka bir çözümdür. 7-zip arşivleri oluşturur ...


7
Markhor tarafından yazılan bu gönderi aslında SevenZipSharp projesinin yaratıcısına aittir. SevenZipSharp, 7Zip dll'ye programlı erişim sağlar, bu da onu tam özellikli hale getirir. LZMA SDK'sını düşük seviyeli ve anlaşılması zor buldum. SevenZipSharp, aksine, iyi belgelenmiştir, kullanımı kolaydır ve test projesinde birçok örnek kullanıma sahiptir. Örnekleri kullanarak, dosya veya bellek kullanarak hızla sıkıştırabilir ve sıkıştırmayı açabilirim.
John Wigger

4
SevenZipSharp terk edilmiş gibi görünüyor. Soruya önceki yorumuma bakın.
Anttu

SevenZipSharp yavaştır. Şu anda en çok önerilen çözüm Process.Start ("7z.exe ......)
klm_

25

C # 'ta SevenZip SDK kullanan eksiksiz bir çalışma örneği burada.

Windows 7zip uygulaması tarafından oluşturulan standart 7zip dosyalarını yazacak ve okuyacaktır.

PS. Önceki örnek, gerekli özellik bilgisini dosyanın başlangıcına asla yazmadığı için asla sıkıştırmayı açmayacaktı.

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

15
Bunun saf LZMA sıkıştırma / açma olduğunu unutmayın. 7zip dosya formatı, dosya adları / yolları ve diğer dosya meta verileriyle birlikte birden çok dosyanın paketlenmesine izin veren bunun üzerindeki bir katmandır.
redcalx

1
@redcalx doğru. Üstteki 7zip katmanını nasıl işleyeceğine dair bir fikri olan var mı? Başka SO yazılan Referans harika :) olurdu
Christopher J Smith

8

Sdk kullandım.

Örneğin:

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

7
Ve dosyayı nasıl açacaksınız? SevenZip.Compression.LZMA.Decoder'ı kullanarak ve Code ile çağırarak (stream1, stream2, -1, -1, null) aynı şeyi yapmaya çalıştım; Bu, çerçeveden bir veri istisnası verdi.
Karsten

3
 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) { }
        }

Sadece kaynaktan 7 zip yükleyin ve parametreyi yönteme iletin.

Teşekkürler. Lütfen cevabı beğen.


Bu benim için
7za.exe

1

Bu kodu kullanıyorum

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

1

Adlı NuGet paketini yükleyin SevenZipSharp.Interop

Sonra:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);

Onunla mevcut 7z arşivine dosya eklemeyi denedim ve arşivim bozuldu.
Geograph

1

@Orwellophile kodu hakkında 17.9MB'lık bir metin dosyası kullanarak bazı ek test bilgileri.
Kod örneğindeki özellik değerlerini "olduğu gibi" kullanmak performans üzerinde BÜYÜK bir olumsuz etkiye sahip olacaktır, 14.16 saniye sürer .

Özellikleri aşağıdaki gibi ayarlamak aynı işi 3.91 saniyede yap (yani arşiv aynı konteyner bilgisine sahip olacaktır: arşivi 7zip ile çıkarabilir ve test edebilirsiniz ancak dosya adı bilgisi yoktur)

Yerel 7zip 2 sn.

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

Yerel 7zip ve 1,2 GB SQL yedekleme dosyası (.bak)
7zip (maksimum sıkıştırma) kullanarak başka bir test yaptım : 1 dakika
LZMA SDK (yukarıdaki özellik ayarına sahip @Orwellophile): 12:26 dak :-(
Outputfile kabaca aynı boyutta .

Sanırım kendim c / c ++ motoruna dayalı bir çözüm kullanacağım, ya c # 'dan 7zip yürütülebilir dosyasını arayacağım ya da 7zip c / c ++ dll dosyası etrafında bir sarmalayıcı olan squid-box / SevenZipSharp kullanacağım ve görünüyor SevenZipSharp'ın en yeni çatalı olacak. Paketleyiciyi test etmedim, ancak umarım yerel 7zip gibi çalışır. Ama umarım bu, akışı sıkıştırmak için bir olasılık sağlar ki bunu doğrudan exe'yi çağırırsanız yapamazsınız. Aksi takdirde exe'yi aramaya göre lapa avantajı yok sanırım. Sarmalayıcıda bazı ek bağımlılıklar vardır, bu nedenle yayınlanan projenizi "daha temiz" yapmaz.

Bu arada, .Net Core ekibi LZMA'yı .Core ver'deki system.io sınıfında uygulamayı düşünüyor gibi görünüyor. 5, bu harika olurdu!

(Bunun bir tür yorum olduğunu ve bir yanıt olmadığını biliyorum, ancak kod parçacığını sağlayabilmek için yorum olamaz)


0

Bunların en kolay yolu .7z yerine .zip dosyalarıyla çalışmak ve Dot Net Zip kullanmaktır.

Kabuk için 7zip komutlarını döndürürken, kullanıcı ayrıcalıkları gibi başka sorunlar da var, SevenZipSharp ile sorun yaşadım.

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

0

SharpCompress , bence piyasadaki en akıllı sıkıştırma kitaplıklarından biridir. LZMA'yı (7-zip) destekler, kullanımı kolaydır ve aktif geliştirme aşamasındadır.

Zaten LZMA akış desteğine sahip olduğu için, yazarken maalesef sadece 7-zip arşiv okumasını destekliyor. ANCAK arşiv yazımı yapılacaklar listesindedir (benioku sayfasına bakın). Gelecekteki okuyucular için: Güncel durumu buradan almak için kontrol edin: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.