2011-01-12 11 views
8

Ho un file zippato con dimensioni di diversi GB, voglio ottenere la dimensione del contenuto decompresso ma non voglio decomprimere il file in C#, quale potrebbe essere la libreria che posso usare ? Quando faccio clic con il pulsante destro del mouse sul file .gz e vai su Proprietà, sotto la scheda Archive c'è un nome di proprietà TotalLength che mostra questo valore. Ma voglio farlo programmaticamente usando C#. Qualche idea?File GZIP Lunghezza totale in C#

+0

Le informazioni potrebbero essere presenti nell'intestazione gzip. Ma non posso aiutare di più. – leppie

risposta

8

Gli ultimi 4 byte del file gz contiene la lunghezza.

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

ah, molto meglio; Non sono sicuro di come questo viene gestito quando> 4 GB anche se –

+0

Grazie Leppie ... effettivamente nel mio caso il file sarà inferiore a 4 GB ... Grazie per il vostro aiuto ... –

+0

@johnnyrose: Grazie per la correzione di errore: 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

MODIFICA: 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 - I Ho visto lo GZipStream e l'equivalente SharpZipLib - non funziona. Il meglio che posso suggerire è quello di eseguire localmente:

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

Grazie Marc, il primo metodo ha funzionato per me .. ma ci vuole troppo tempo per calcolare un file non compresso di 2 GB ... e dovrebbe essere come stiamo contando in loop ... Non c'è un modo rapido? –

+0

@Ummar: sia io che Gabe abbiamo spiegato il modo "corretto" di farlo. Il metodo sopra funzionerà, ma immaginate di usarlo su migliaia di file da 2 GB, ci vorrà per sempre. – leppie

+0

@Ummar - vedere la risposta di @ leppie –

4

l'ultimo per byte di un file .gz sono le dimensioni del modulo di ingresso non compresso 2^32. Se il file non compresso non è più grande di 4 GB, leggi solo gli ultimi 4 byte del file. Se hai un file più grande, non sono sicuro che sia possibile ottenere senza decomprimere il flusso.