У меня есть zipped-файл размером в несколько ГБ, я хочу получить размер Unzipped содержимого, но не хочу на самом деле разархивировать файл на C#, Что может быть Библиотека, которую я могу использовать ? Когда я нажимаю правой кнопкой мыши на .gz-файле и перехожу в «Свойства», то под вкладкой Archive
есть имя свойства TotalLength
, которое показывает это значение. Но я хочу получить его программно с помощью C#. Любая идея?Файл GZIP Общая длина в 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);
}
ах, намного лучше; Я не уверен, как это обрабатывается, когда> 4 ГБ, хотя –
Спасибо Leppie ... на самом деле в моем случае файл будет меньше 4 ГБ ... Спасибо за вашу помощь ... –
@johnnyrose: Спасибо за исправление опечатки: D – leppie
public static long mGetFileLength(string strFilePath)
{
if (!string.IsNullOrEmpty(strFilePath))
{
System.IO.FileInfo info = new System.IO.FileInfo(strFilePath);
return info.Length;
}
return 0;
}
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;
}
}
Спасибо Marc, первый метод работал для меня .. но его слишком много времени, чтобы вычислить несжатый файл объемом 2 ГБ ... и это должно быть, поскольку мы рассчитываем в цикле ... Не существует ли быстрого пути? –
@ Умммар: И Гейб, и я объясняли «правильный» способ сделать это. Вышеупомянутый способ будет работать, но представьте, что вы используете его на 1000-битных файлах объемом 2 ГБ, и это займет много времени. – leppie
@Ummar - см. Ответ @ leppie –
Последние за байты .gz файла имеют размер несжатого вход по модулю 2^32. Если ваш несжатый файл не превышает 4 ГБ, просто прочитайте последние 4 байта файла. Если у вас есть более крупный файл, я не уверен, что можно получить без разжатия потока.
Информация может присутствовать в заголовке gzip. Но я не могу больше помочь. – leppie