Pregunta

Tengo un archivo comprimido que tiene un tamaño de varios GB, quiero obtener el tamaño de contenido desabrochado, pero no quiero realmente descomprimir el archivo en C #, lo que podría ser la Biblioteca puedo usar? Cuando hago clic derecho sobre el archivo .gz y vaya a Propiedades entonces bajo el Archive Tab hay un TotalLength nombre de la propiedad que está mostrando este valor. Pero quiero conseguirlo mediante programación con C # .. Alguna idea?

¿Fue útil?

Solución

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

Otros consejos

El último de bytes de un archivo .gz son el tamaño de entrada sin comprimir módulo 2 ^ 32. Si el archivo no comprimido no es mayor que 4 GB, acabo de leer los últimos 4 bytes del archivo. Si usted tiene un archivo más grande, no estoy seguro de que es posible conseguir sin descomprimir la corriente.

EDIT: Ver las respuestas por 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 - He mirado en GZipStream y la SharpZipLib equivalente - ni obras. Lo mejor que puedo sugerir es ejecutar de forma local:

    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;
        }
    }
public static long mGetFileLength(string strFilePath)
{
    if (!string.IsNullOrEmpty(strFilePath))
    {
        System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
        return info.Length;
    }

    return 0; 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top