Вопрос
У меня есть застегнутый файл, имеющий размер несколько ГБ, я хочу получить размер расстегнутого содержимого, но я не хочу на самом деле распаковать файл в 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;
}