Kompresi / dekompresi složky a soubory

hlasů
42

Ví někdo o dobrý způsob, jak stlačit nebo rychlé dekompresi souborů a složek v C #? Manipulaci s velkými soubory, může být nezbytné.

Položena 01/08/2008 v 18:13
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
24

Rámec namespace .Net 2.0 System.IO.Compressionpodporuje gzip a vyfouknout algoritmy. Zde jsou dvě metody, které kompresi a dekompresi streamu dat, které můžete získat z vašeho souboru objektu. Můžete subsitute GZipStreampro DefaultStreamv metodách dále používat tento algoritmus. To stále zůstává problém práci se soubory komprimované pomocí různých algoritmů ačkoli.

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();
}
Odpovězeno 05/08/2008 v 13:04
zdroj uživatelem

hlasů
21

Vždycky jsem použil SharpZip knihovna.

Zde je odkaz

Odpovězeno 01/08/2008 v 18:30
zdroj uživatelem

hlasů
10

Jak .Net 1.1 jediná dostupná metoda sahá do knihovny Java.
Pomocí zipu třídy v J # knihovny třídy komprimovat soubory a data pomocí C #
Není si jistý, jestli se to změnilo v posledních verzích.

Odpovězeno 01/08/2008 v 18:28
zdroj uživatelem

hlasů
8

Moje odpověď by se zavřít oči a rozhodnout se pro DotNetZip . To bylo testováno s velkou komunitu.

Odpovězeno 17/11/2013 v 17:08
zdroj uživatelem

hlasů
8

Můžete použít knihovnu třetí strany, jako je SharpZip jako Tom poukázal.

Dalším způsobem, (aniž by 3rd-party) je pomocí rozhraní API Windows Shell. Budete muset nastavit odkaz na ovládací prvky Microsoft Shell a knihovna Automation COM v C # projektu. Gerald Gibson má příklad na:

http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx

Internet Archive je kopie mrtvých stránky

Odpovězeno 01/08/2008 v 19:04
zdroj uživatelem

hlasů
6

GZipStream je opravdu dobrý nástroj k použití.

Odpovězeno 13/05/2012 v 03:01
zdroj uživatelem

hlasů
6

To je velmi snadné dělat v Javě, a jak je uvedeno výše, můžete dostat do java.util.zip knihovny z C #. Reference viz:

java.util.zip javadocs
ukázkový kód

Použil jsem to před chvílí k tomu hluboký (rekurzivní) zip o adresářové struktury, ale nemyslím si, že jsem kdy použil rozbalení. Jestli jsem tak motivován mohu vytáhnout ten kód ven a upravit jej do sem později.

Odpovězeno 05/08/2008 v 00:52
zdroj uživatelem

hlasů
5

Další dobrou alternativou je také DotNetZip .

Odpovězeno 08/12/2011 v 23:29
zdroj uživatelem

hlasů
0

můžete vytvořit zip soubor s touto metodou:

public async Task<string> 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;
    }

a pak můžete rozbalit zip soubor s těmito metodami:
1 tento způsob práce s cestou zip souboru

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- Tento způsob práce se zipem streamu souboru

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));
    }
Odpovězeno 09/01/2018 v 18:35
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more