2011-01-12 6 views
8

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#

+0

Die Informationen können im gzip-Header vorhanden sein. Aber ich kann nicht mehr als das helfen. – leppie

Antwort

8

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); 
} 
+1

ah, viel besser; Ich bin nicht sicher, wie das gehandhabt wird, wenn> 4GB obwohl –

+0

Danke Leppie ... tatsächlich in meinem Fall wird die Datei weniger als 4GB sein ... Danke für Ihre Hilfe ... –

+0

@johnnyrose: Danke für Tippfehlerkorrektur: D – leppie

-1
public static long mGetFileLength(string strFilePath) 
{ 
    if (!string.IsNullOrEmpty(strFilePath)) 
    { 
     System.IO.FileInfo info = new System.IO.FileInfo(strFilePath); 
     return info.Length; 
    } 

    return 0; 
} 
2

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; 
     } 
    } 
+0

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? –

+0

@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

+0

@Ummar - siehe @ leppies Antwort –

4

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.