La Compressione / Decompressione Di Cartelle E Files
-
08-06-2019 - |
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.
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:
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));
}