Domanda

Qualcuno conosce un buon modo per comprimere o decomprimere i file e le cartelle in C# in fretta?Gestione di file di grandi dimensioni può essere necessario.

Nessuna soluzione corretta

Altri suggerimenti

L' .Net 2.0 framework spazio dei nomi System.IO.Compression supporta GZip o Deflate algoritmi.Qui ci sono due metodi per comprimere e decomprimere un flusso di byte che si può ottenere dal vostro file oggetto.Si può supplire GZipStream per DefaultStream nei metodi di sotto di utilizzare tale algoritmo.Questo lascia ancora il problema di gestire i file compressi con algoritmi diversi, però.

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

Ho sempre usato il SharpZip Biblioteca.

Ecco un link

Come di .Net 1.1 l'unico metodo a disposizione è di raggiungere in librerie java.
Utilizzando il file Zip Classi in J# Librerie di classi per Comprimere i File e Dati con C#
Non sono sicuro se questo è cambiato nelle versioni più recenti.

È possibile utilizzare un 3 ° -partito libreria come SharpZip Tom ha sottolineato.

Un altro modo (senza andare 3a parte) è quello di utilizzare la Shell di Windows API.È necessario impostare un riferimento a Microsoft Shell il controllo e l'Automazione COM libreria nel progetto C#.Gerald Gibson è un esempio:

Internet Archive copia di una pagina morta

La mia risposta sarebbe chiudere gli occhi e optare per DotNetZip.E ' stato testato da una vasta comunità.

GZipStream è davvero un ottimo programma di utilità per l'uso.

Questo è molto facile da fare in java, e come detto sopra, che si può raggiungere nel java.util.zip le librerie in C#.Per i riferimenti si veda:

java.util.zip javadoc
codice di esempio

Ho usato questo un po ' di tempo fa a fare un deep (ricorsiva) zip di una struttura di cartelle, ma io non credo di aver mai usato la decompressione.Se io sono così motivati posso tirare il codice e modificarlo in seguito.

Un'altra buona alternativa è anche DotNetZip.

è possibile creare file zip con questo metodo:

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

e poi è possibile decomprimere file zip con questo metodo:
1 - questo metodo di lavoro con il file zip del percorso

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 - questo metodo di lavoro con il 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));
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top