2011-01-12 12 views
8

Tengo un archivo comprimido que tiene un tamaño de varios GB, quiero obtener el tamaño de los contenidos descomprimidos pero no quiero descomprimir realmente el archivo en C#, lo que podría ser la biblioteca que puedo usar ? Cuando hago clic con el botón secundario en el archivo .gz y voy a Propiedades, debajo de la pestaña Archive aparece el nombre de propiedad TotalLength que muestra este valor. Pero quiero obtenerlo programáticamente usando C# ... ¿Alguna idea?Archivo GZIP Longitud total en C#

+0

La información puede estar presente en el encabezado gzip. Pero no puedo ayudar más que eso. – leppie

Respuesta

8

Los últimos 4 bytes del archivo gz contiene la longitud.

Por lo tanto, debe ser algo como:

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, mucho mejor; No estoy seguro de cómo se maneja esto cuando> 4GB aunque –

+0

Gracias Leppie ... en realidad, en mi caso el archivo será de menos de 4 GB ... Gracias por su ayuda ... –

+0

@johnnyrose: Gracias por la corrección de errores tipográficos: 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: Vea las respuestas de Leppie y Gabe; la única razón por la que estoy teniendo esto (en lugar de eliminarlo) es que puede ser necesario si se sospecha que la longitud es> 4 GB


Para gzip, que los datos no parecen estar directamente disponible - I He visto GZipStream y el equivalente SharpZipLib - ninguno funciona. Lo mejor que puedo sugerir es para ejecutarlo 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; 
     } 
    } 

Si se trata de una cremallera, entonces SharpZipLib:

long size = 0; 
    using(var zip = new ZipFile(path)) { 
     foreach (ZipEntry entry in zip) { 
      size += entry.Size; 
     } 
    } 
+0

Gracias Marc, el primer método funcionó para mí ... pero está tardando mucho en calcular un archivo sin comprimir de 2 GB ... y debería serlo mientras estamos contando en bucle ... ¿No hay alguna manera rápida? –

+0

@Ummar: Tanto Gabe como yo explicamos la forma "correcta" de hacer esto. La forma anterior funcionará, pero imagínese usarla en miles de archivos de 2GB, llevará una eternidad. – leppie

+0

@Ummar - vea la respuesta de @ leppie –

4

El último de bytes de un archivo .gz son el tamaño de módulo de entrada sin comprimir 2^32. Si su archivo descomprimido no es más grande que 4GB, simplemente lea los últimos 4 bytes del archivo. Si tiene un archivo más grande, no estoy seguro de que sea posible obtenerlo sin descomprimir la transmisión.

Cuestiones relacionadas