Er det noen som vet om en god måte å komprimere eller dekomprimere filer og mapper i C # raskt? Håndtering av store filer kan være nødvendig.
Komprimere / dekomprimere mapper og filer
Per Net 1.1 den eneste tilgjengelige metoden er å nå inn i de Java-bibliotekene.
Bruke Zip klasser i J # Class Libraries for å komprimere filer og data med C #
Ikke sikker på om dette har endret seg de siste versjonene.
Jeg har alltid brukt SharpZip Biblioteket.
Du kan bruke en tredje-parts bibliotek som SharpZip som Tom påpekt.
En annen måte (uten å gå tredje-parts) er å bruke Windows Shell API. Du må sette en referanse til Microsoft Shell kontroller og automatisering COM bibliotek i C # prosjekt. Gerald Gibson har et eksempel på:
http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx
Dette er veldig enkelt å gjøre i java, og som nevnt ovenfor kan du komme inn i java.util.zip biblioteker fra C #. For referanser se:
java.util.zip javadocs
eksempelkode
Jeg brukte dette for en stund siden å gjøre en dyp (rekursiv) zip av en mappestruktur, men jeg tror ikke jeg noen gang brukt unzipping. Hvis jeg er så motivert jeg kan trekke den koden ut og redigere det inn her senere.
.Net 2.0 rammeverket navne System.IO.Compression
støtter gzip og deflate algoritmer. Her er to metoder som komprimere og dekomprimere en byte strøm som du kan få fra din fil objekt. Du kan høyminne GZipStream
for DefaultStream
i metodene nedenfor for å bruke denne algoritmen. Dette etterlater fortsatt problemet med å håndtere filer komprimert med ulike algoritmer skjønt.
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();
}
Et annet godt alternativ er også DotNetZip .
GZipStream er en virkelig god nytte å bruke.
Mitt svar ville bli lukke øynene og velge DotNetZip . Det har blitt testet av et stort fellesskap.
du kan lage zip-fil med denne metoden:
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;
}
og så kan du pakke ut zip-fil med dette metoder:
1 denne metoden arbeidet med zip-fil banen
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- denne fremgangsmåte arbeide med glidelås filstrøm
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));
}