GZIP-Datei Gesamtlänge in C #
Frage
Ich habe eine ZIP-Datei mit einer Größe von mehreren GBs, möchte ich die Größe der entpackten Inhalte bekommen, wollen aber nicht, um tatsächlich Entpacken Sie die Datei in C #, Was könnte die Bibliothek kann ich verwenden werden? Wenn ich direkt an der .gz-Datei klicken und wählen Sie Eigenschaften dann unter dem Archive
Tab gibt es einen Eigenschaftsnamen TotalLength
, die diesen Wert angezeigt wird. Aber ich will es bekommen Programmatically C mit # .. Jede Idee?
Lösung
Die letzten 4 Bytes der gz-Datei enthält die Länge.
So ist es etwas sein sollte:
using(var fs = File.OpenRead(path))
{
fs.Position = fs.Length - 4;
var b = new byte[4];
fs.Read(b, 0, 4);
uint length = BitConverter.ToUInt32(b, 0);
Console.WriteLine(length);
}
Andere Tipps
Die letzte für Bytes einer gz-Datei sind die unkomprimierte Eingangsgröße 2 Modulo ^ 32. Wenn Ihre unkomprimierten Datei nicht größer als 4 GB ist, lesen Sie einfach die letzten 4 Bytes der Datei. Wenn Sie eine größere Datei haben, bin ich nicht sicher, dass es möglich ist, den Strom zu erhalten, ohne dekomprimiert.
EDIT: Siehe die Antworten von leppie und Gabe; der einzige Grund, warum ich dies zu halten (anstatt sie zu löschen) ist, dass es notwendig sein kann, wenn Sie die Länge> 4 GB
Für gzip, dass Daten scheinen nicht direkt verfügbar zu sein - ich habe bei GZipStream
sieht und die SharpZipLib Äquivalent - weder Werke. Das Beste, was ich vorschlagen kann, ist es lokal ausführen:
long length = 0;
using(var fs = File.OpenRead(path))
using (var gzip = new GZipStream(fs, CompressionMode.Decompress)) {
var buffer = new byte[10240];
int count;
while ((count = gzip.Read(buffer, 0, buffer.Length)) > 0) {
length += count;
}
}
Wenn es ein zip, dann SharpZipLib:
long size = 0;
using(var zip = new ZipFile(path)) {
foreach (ZipEntry entry in zip) {
size += entry.Size;
}
}
public static long mGetFileLength(string strFilePath)
{
if (!string.IsNullOrEmpty(strFilePath))
{
System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
return info.Length;
}
return 0;
}