Domanda

Ho un file compresso con dimensioni di diversi GB, voglio ottenere la dimensione dei contenuti Unzipped, ma non voglio in realtà decomprimere il file in C #, quale potrebbe essere la Biblioteca posso usare? Quando mi fate clic destro sul file .gz e vado a Proprietà poi sotto il Archive Tab v'è un nome di proprietà TotalLength che sta mostrando questo valore. Ma voglio farlo a livello di programmazione utilizzando C # .. Qualche idea?

È stato utile?

Soluzione

Gli ultimi 4 byte del file gz contiene la lunghezza.

Quindi dovrebbe essere qualcosa di simile:

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

Altri suggerimenti

L'ultima di byte di un file .gz sono le dimensioni di ingresso non compressa modulo 2 ^ 32. Se il file non compresso non è più grande di 4 GB, basta leggere gli ultimi 4 byte del file. Se si dispone di un file più grande, non sono sicuro che sia possibile ottenere senza decomprimere il flusso.

EDIT: vedere le risposte di leppie e Gabe; l'unica ragione per cui sto tenendo questo (anziché eliminarlo) è che può essere necessario se si sospetta che la lunghezza è> 4GB


Per gzip, che i dati non sembra essere direttamente disponibili - Ho guardato GZipStream e la SharpZipLib equivalente - né opere. Il meglio che posso suggerire è quello di eseguire in locale:

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

Se fosse un lampo, poi 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; 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top