Comprimeren / Decompressing mappen en bestanden

stemmen
42

Weet iemand een goede manier om in- of uitpakken van bestanden en mappen in C # snel? Het verwerken van grote bestanden kan het nodig zijn.

De vraag is gesteld op 01/08/2008 om 18:13
bron van user
In andere talen...                            


9 antwoorden

stemmen
10

Vanaf Net 1.1 de enige beschikbare werkwijze tot in de java libraries.
Met behulp van de Zip Classes in de J # Class Libraries om bestanden en gegevens comprimeren met C #
Niet zeker of dit is veranderd in recente versies.

antwoordde op 01/08/2008 om 18:28
bron van user

stemmen
21

Ik heb altijd gebruik gemaakt van de SharpZip Library.

Hier is een link

antwoordde op 01/08/2008 om 18:30
bron van user

stemmen
8

U kunt gebruik maken van een 3rd-party bibliotheek zoals SharpZip als Tom gewezen.

Een andere manier (zonder 3rd-party) is om de Windows-shell API. Je moet een verwijzing naar de Microsoft Shell Controls and Automation COM-bibliotheek in uw C # project. Gerald Gibson is een voorbeeld op:

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

Internet Archive exemplaar van de doden pagina

antwoordde op 01/08/2008 om 19:04
bron van user

stemmen
6

Dit is zeer gemakkelijk te doen in Java, en zoals hierboven vermeld je kunt bereiken in de java.util.zip bibliotheken van C #. Voor referenties zie:

java.util.zip javadocs
steekproefcode

Ik heb dit een tijdje geleden om een ​​diepe (recursieve) zip van een mappenstructuur te doen, maar ik denk niet dat ik ooit de openritsen gebruikt. Als ik zo gemotiveerd ik kan die code uit te trekken en bewerken in hier later.

antwoordde op 05/08/2008 om 00:52
bron van user

stemmen
24

Het .Net 2.0 framework namespace System.IO.Compressionondersteunt GZip en Deflate algoritmen. Hier zijn twee methoden die het comprimeren en decomprimeren een byte stroom die je kunt krijgen van uw dossier object. U kunt subsitute GZipStreamvoor DefaultStreamin de methoden hieronder om dat algoritme gebruiken. Dit is het probleem van het hanteren bestanden gecomprimeerd met verschillende algoritmen al laat nog.

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();
}
antwoordde op 05/08/2008 om 13:04
bron van user

stemmen
5

Een ander goed alternatief is ook DotNetZip .

antwoordde op 08/12/2011 om 23:29
bron van user

stemmen
6

GZipStream is echt een goed programma te gebruiken.

antwoordde op 13/05/2012 om 03:01
bron van user

stemmen
8

Mijn antwoord zou zijn sluit je ogen en kiezen voor DotNetZip . Het is getest door een grote gemeenschap.

antwoordde op 17/11/2013 om 17:08
bron van user

stemmen
0

U kunt zip-bestand maken met deze methode:

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

en dan kun je zip-bestand uit te pakken met deze methoden:
1- deze methode werken met zip-bestand pad

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- deze methode werken met zip bestandsstroom

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));
    }
antwoordde op 09/01/2018 om 18:35
bron van user

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