Kompresi / Dekompresi Folder & File

Apakah ada yang tahu cara yang baik untuk compress atau dekompresi file dan folder di C# dengan cepat? Penanganan file besar mungkin diperlukan.

Yang .Net 2.0 framework namespace Sistem.IO.Kompresi mendukung GZip dan algoritma Deflate. Berikut ini adalah dua metode yang kompres dan dekompresi sebuah byte stream yang bisa anda dapatkan dari file objek. Anda dapat subsitute GZipStream untuk DefaultStream dalam metode di bawah ini untuk menggunakan algoritma itu. Ini masih menyisakan masalah penanganan file yang dikompresi dengan algoritma yang berbeda sekalipun.

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();

    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buff = new byte[64];
    int read = -1;

    read = gzip.Read(buff, 0, buff.Length);

    while (read > 0)
    {
        output.Write(buff, 0, read);
        read = gzip.Read(buff, 0, buff.Length);
    }

    gzip.Close();

    return output.ToArray();
}
Komentar (0)

I've selalu digunakan SharpZip Perpustakaan.

Di sini's link

Komentar (1)

Sebagai dari .Net 1.1 satu-satunya metode yang tersedia adalah menjangkau ke perpustakaan java.
Menggunakan Resleting Kelas di J# Perpustakaan Kelas untuk Kompres File dan Data dengan C#
Tidak yakin jika hal ini telah berubah dalam beberapa versi.

Komentar (0)

Anda dapat menggunakan pihak ke-3 perpustakaan seperti SharpZip sebagai Tom menunjuk keluar.

Cara lain (tanpa pihak ke-3) adalah dengan menggunakan Shell Windows API. Anda'll perlu untuk mengatur referensi ke Microsoft Shell Kontrol dan Otomatisasi COM perpustakaan di C# proyek. Gerald Gibson memiliki contoh di:

Internet Archive's copy mati page

Komentar (0)

Jawaban saya akan menutup mata anda dan memilih untuk DotNetZip. It's telah diuji oleh sebuah komunitas besar.

Komentar (0)

GZipStream adalah benar-benar utilitas yang baik untuk digunakan.

Komentar (0)

Ini sangat mudah untuk dilakukan di jawa, dan seperti yang dinyatakan di atas anda dapat mencapai ke java.util.zip perpustakaan dari C#. Untuk referensi lihat:

java.util.zip javadocs
contoh kode

Saya menggunakan ini saat yang lalu untuk melakukan deep (rekursif) zip dari struktur folder, tapi aku don't pikir saya pernah menggunakan unzip. Jika saya'm jadi termotivasi saya dapat menarik kode yang keluar dan edit ke sini nanti.

Komentar (0)

Alternatif lain yang baik juga DotNetZip.

Komentar (0)

anda dapat membuat file zip dengan metode ini:

public async Task CreateZipFile(string sourceDirectoryPath, string name)
    {
        var path = HostingEnvironment.MapPath(TempPath) + name;
        await Task.Run(() =>
        {
            if (File.Exists(path)) File.Delete(path);
            ZipFile.CreateFromDirectory(sourceDirectoryPath, path);
        });
        return path;
    }

dan kemudian anda dapat meng-unzip file zip dengan metode ini:
1 - metode ini bekerja dengan file zip jalan

public async Task ExtractZipFile(string filePath, string destinationDirectoryName)
    {
        await Task.Run(() =>
        {
            var archive = ZipFile.Open(filePath, ZipArchiveMode.Read);
            foreach (var entry in archive.Entries)
            {
                entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true);
            }
            archive.Dispose();
        });
    }

2 - metode ini bekerja dengan file zip stream

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName)
    {
        string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue);
        using (FileStream output = new FileStream(filePath, FileMode.Create))
        {
            await zipFile.CopyToAsync(output);
        }
        await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName));
        await Task.Run(() => File.Delete(filePath));
    }
Komentar (0)