Ich habe eine gezippte Datei mit einer Größe von mehreren GBs, ich möchte die Größe von entpackten Inhalten, aber nicht wirklich die Datei in C# entpacken, Was könnte die Bibliothek, die ich verwenden kann ? Wenn ich mit der rechten Maustaste auf die .gz-Datei klicke und zu Eigenschaften gehe, dann gibt es unter der Registerkarte Archive
einen Eigenschaftsnamen TotalLength
, der diesen Wert anzeigt. Aber ich möchte es programmgesteuert mit C# bekommen .. Irgendeine Idee?GZIP-Datei Gesamtlänge in C#
Antwort
Die letzten 4 Bytes der gz-Datei enthält die Länge.
So sollte es so etwas wie sein:
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);
}
ah, viel besser; Ich bin nicht sicher, wie das gehandhabt wird, wenn> 4GB obwohl –
Danke Leppie ... tatsächlich in meinem Fall wird die Datei weniger als 4GB sein ... Danke für Ihre Hilfe ... –
@johnnyrose: Danke für Tippfehlerkorrektur: D – leppie
public static long mGetFileLength(string strFilePath)
{
if (!string.IsNullOrEmpty(strFilePath))
{
System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
return info.Length;
}
return 0;
}
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> 4GB
Für gzip vermuten, ist, dass die Daten nicht direkt verfügbar zu sein scheinen - I habe mir GZipStream
angesehen und das SharpZipLib entspricht - keiner funktioniert. Das Beste, was ich vorschlagen kann, ist es lokal auszufü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 war, dann SharpZipLib:
long size = 0;
using(var zip = new ZipFile(path)) {
foreach (ZipEntry entry in zip) {
size += entry.Size;
}
}
Danke Marc, die erste Methode funktionierte für mich .. aber es dauert zu lange, um eine 2 GB unkomprimierte Datei zu berechnen ... und es sollte so sein, wie wir in Schleife zählen ... Gibt es keinen schnellen Weg? –
@Ummar: Sowohl Gabe als auch ich erklärten die "richtige" Art und Weise, dies zu tun. Der obige Weg wird funktionieren, aber stellen Sie sich vor, es auf 1000 von 2GB-Dateien zu verwenden, wird es ewig dauern. – leppie
@Ummar - siehe @ leppies Antwort –
Die letzte für Bytes einer gz-Datei werden die unkomprimierten Eingangsgröße Modulo 2^32. Wenn Ihre unkomprimierte 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 mir nicht sicher, ob es möglich ist, den Stream zu dekomprimieren.
Die Informationen können im gzip-Header vorhanden sein. Aber ich kann nicht mehr als das helfen. – leppie