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?

War es hilfreich?

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; 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top