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?

Était-ce utile?

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; 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top