2011-01-12 2 views
8

У меня есть zipped-файл размером в несколько ГБ, я хочу получить размер Unzipped содержимого, но не хочу на самом деле разархивировать файл на C#, Что может быть Библиотека, которую я могу использовать ? Когда я нажимаю правой кнопкой мыши на .gz-файле и перехожу в «Свойства», то под вкладкой Archive есть имя свойства TotalLength, которое показывает это значение. Но я хочу получить его программно с помощью C#. Любая идея?Файл GZIP Общая длина в C#

+0

Информация может присутствовать в заголовке gzip. Но я не могу больше помочь. – leppie

ответ

8

Последние 4 байта файла GZ содержит длину.

Так оно и должно быть что-то вроде:

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

ах, намного лучше; Я не уверен, как это обрабатывается, когда> 4 ГБ, хотя –

+0

Спасибо Leppie ... на самом деле в моем случае файл будет меньше 4 ГБ ... Спасибо за вашу помощь ... –

+0

@johnnyrose: Спасибо за исправление опечатки: 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: см. Ответы Леппи и Гейба; единственная причина, почему я держу это (а не удаляя его), что это может быть необходимо, если вы подозреваете, что длина> 4 Гб


Для Gzip, что данные не кажутся непосредственно доступны - I 've посмотрел на GZipStream и эквивалент SharpZipLib - не работает. Лучшее, что я могу предложить, чтобы запустить его локально:

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

Если бы это была молния, то SharpZipLib:

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

Спасибо Marc, первый метод работал для меня .. но его слишком много времени, чтобы вычислить несжатый файл объемом 2 ГБ ... и это должно быть, поскольку мы рассчитываем в цикле ... Не существует ли быстрого пути? –

+0

@ Умммар: И Гейб, и я объясняли «правильный» способ сделать это. Вышеупомянутый способ будет работать, но представьте, что вы используете его на 1000-битных файлах объемом 2 ГБ, и это займет много времени. – leppie

+0

@Ummar - см. Ответ @ leppie –

4

Последние за байты .gz файла имеют размер несжатого вход по модулю 2^32. Если ваш несжатый файл не превышает 4 ГБ, просто прочитайте последние 4 байта файла. Если у вас есть более крупный файл, я не уверен, что можно получить без разжатия потока.