fichier GZIP Longueur totale en C #
Question
J'ai un fichier compressé ayant la taille de plusieurs GBS, je veux obtenir la taille du contenu Unzipped mais ne veux pas réellement Décompressez le fichier en C #, ce qui pourrait être la bibliothèque que je peux utiliser? Lorsque je clique droit sur le fichier .gz et accédez aux propriétés puis sous l'onglet Archive
il y a un nom de propriété TotalLength
qui montre cette valeur. Mais je veux l'obtenir en utilisant C # .. Programmatically Toute idée?
La solution
Les 4 derniers octets du fichier gz contient la longueur.
Il doit donc être quelque chose comme:
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);
}
Autres conseils
Le dernier pour les octets d'un fichier Gz sont de la taille d'entrée non compressée modulo 2 ^ 32. Si votre fichier non compressé n'est pas plus de 4 Go, suffit de lire les 4 derniers octets du fichier. Si vous avez un fichier plus volumineux, je ne suis pas sûr qu'il est possible d'obtenir sans décompresser le flux.
EDIT: Voir les réponses par leppie et Gabe; la seule raison pour laquelle je garde ce (plutôt que de le supprimer) est qu'il peut être nécessaire si vous pensez que la longueur est> 4 Go
Pour gzip, que les données ne semble pas être directement disponibles - je l'ai regardé GZipStream
et SharpZipLib équivalente - ni œuvres. Le mieux que je peux suggérer, est de fonctionner localement:
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;
}
}
Si c'était un zip, puis 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;
}