GZIP файл Общая длина в C # - PullRequest
8 голосов
/ 12 января 2011

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

Ответы [ 4 ]

11 голосов
/ 12 января 2011

Последние 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);
}
4 голосов
/ 12 января 2011

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

2 голосов
/ 12 января 2011

РЕДАКТИРОВАТЬ: см. Ответы Леппи и Гейба;единственная причина, по которой я сохраняю это (а не удаляю), заключается в том, что это может быть необходимо, если вы подозреваете, что длина> 4 ГБ


Для gzip эти данные, по-видимому, не доступны напрямую.- Я смотрел на 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 голосов
/ 12 января 2011
public static long mGetFileLength(string strFilePath)
{
    if (!string.IsNullOrEmpty(strFilePath))
    {
        System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
        return info.Length;
    }

    return 0; 
}
...