Вопрос

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

Это было полезно?

Решение

Последние 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);
}

Другие советы

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

РЕДАКТИРОВАТЬ: См. Ответы Леппи и Гейба; Единственная причина, по которой я сохраняю это (а не удаляю), заключается в том, что это может потребоваться, если вы подозреваете, что длина> 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;
        }
    }
public static long mGetFileLength(string strFilePath)
{
    if (!string.IsNullOrEmpty(strFilePath))
    {
        System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
        return info.Length;
    }

    return 0; 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top