Komprimieren/Dekomprimieren von Ordnern und Dateien
-
08-06-2019 - |
Frage
Kennt jemand eine gute Möglichkeit, Dateien und Ordner in C# schnell zu komprimieren oder zu dekomprimieren?Der Umgang mit großen Dateien kann erforderlich sein.
Keine korrekte Lösung
Andere Tipps
Der .Net 2.0-Framework-Namespace System.IO.Compression
unterstützt GZip- und Deflate-Algorithmen.Hier sind zwei Methoden zum Komprimieren und Dekomprimieren eines Bytestroms, den Sie von Ihrem Dateiobjekt erhalten können.Sie können ersetzen GZipStream
für DefaultStream
in den folgenden Methoden, um diesen Algorithmus zu verwenden.Damit bleibt jedoch immer noch das Problem bestehen, Dateien zu verarbeiten, die mit unterschiedlichen Algorithmen komprimiert wurden.
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();
}
Ich habe immer die SharpZip-Bibliothek verwendet.
Ab .Net 1.1 ist die einzige verfügbare Methode der Zugriff auf die Java-Bibliotheken.
Verwenden der Zip-Klassen in den J#-Klassenbibliotheken zum Komprimieren von Dateien und Daten mit C#
Ich bin mir nicht sicher, ob sich dies in den letzten Versionen geändert hat.
Sie können a verwenden Bibliothek eines Drittanbieters wie SharpZip wie Tom betonte.
Eine andere Möglichkeit (ohne auf einen Drittanbieter zurückgreifen zu müssen) ist die Verwendung der Windows-Shell-API.Sie müssen in Ihrem C#-Projekt einen Verweis auf die Microsoft Shell Controls and Automation COM-Bibliothek festlegen.Gerald Gibson hat ein Beispiel unter:
Meine Antwort wäre, die Augen zu schließen und sich für zu entscheiden DotNetZip.Es wurde von einer großen Community getestet.
GZipStream ist ein wirklich gutes Dienstprogramm.
Dies ist in Java sehr einfach zu bewerkstelligen, und wie oben erwähnt können Sie über C# auf die java.util.zip-Bibliotheken zugreifen.Referenzen finden Sie unter:
java.util.zip Javadocs
Beispielcode
Ich habe dies vor einiger Zeit verwendet, um eine tiefe (rekursive) Zip-Datei einer Ordnerstruktur zu erstellen, aber ich glaube nicht, dass ich das Entpacken jemals verwendet habe.Wenn ich so motiviert bin, kann ich den Code herausholen und ihn später hier bearbeiten.
Eine weitere gute Alternative ist auch DotNetZip.
Mit dieser Methode können Sie eine ZIP-Datei erstellen:
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;
}
Anschließend können Sie die ZIP-Datei mit den folgenden Methoden entpacken:
1- Diese Methode funktioniert mit dem ZIP-Dateipfad
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- Diese Methode funktioniert mit ZIP-Dateistream
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));
}