У меня есть заархивированный файл размером в несколько ГБ, я хочу получить размер разархивированного содержимого, но не хочу распаковывать файл на С#. Какую библиотеку я могу использовать? Когда я щелкаю правой кнопкой мыши файл .gz и захожу в «Свойства», затем на вкладке Archive
появляется имя свойства TotalLength
, которое показывает это значение. Но я хочу получить его программно, используя С#. Любая идея?
Общая длина файла GZIP в C#
Ответы (3)
Последние 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;
}
}
Если это был zip, то SharpZipLib:
long size = 0;
using(var zip = new ZipFile(path)) {
foreach (ZipEntry entry in zip) {
size += entry.Size;
}
}