archivo GZIP Longitud total en C #
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?
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;
}