Question

Je sais qu'il existe des bibliothèques pour travailler avec des fichiers ZIP . Et vous pouvez également utiliser la fonctionnalité intégrée à Windows pour les fichiers ZIP fonctionnels .

Mais je me demande si quelqu'un a déjà découvert comment utiliser les outils intégrés à l'espace de noms System.IO.Compression dans .NET pour lire / écrire des fichiers ZIP? Ou n'est-il pas possible d'utiliser uniquement cet espace de noms?

UPDATED: Il semble que quelqu'un ait dit que l'espace de noms System.IO.Packaging pourrait également être utile avec cela. Est-ce que quelqu'un sait exactement comment le faire?

Était-ce utile?

La solution

MSDN dispose d'un exemple < a href = "http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx" rel = "noreferrer"> http://msdn.microsoft.com/en-us/ library / system.io.packaging.zippackage.aspx à l'aide de la classe ZipPackage. Nécessite .NET 3.5.

Autres conseils

Dave, très gentil !! Je ne savais pas que c'était là.

Maintenant que je sais quoi chercher, j'ai pu trouver un article avec un petit exemple de code sur la façon de l'utiliser: http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

Sur une note connexe, j’ai également trouvé le projet DotNetZip extrêmement facile à utiliser.

Vous souhaiterez utiliser une bibliothèque tierce, telle que http://www.codeplex.com/DotNetZip , plutôt que d'essayer d'utiliser GZipStream ou DeflateStream pour lire un fichier zip.

Les classes de flux *** dans .NET peuvent vous permettre de lire ou d’écrire des flux d’octets compressés. Ces classes ne lisent ni n'écrivent de fichiers zip. Le fichier zip est constitué de données compressées entourées d'une "enveloppe". ou un en-tête. Considérez-les comme des métadonnées - elles incluent le nom du fichier, l’horodatage, le CRC et bien d’autres éléments. Les classes ** Stream ne produisent que le flux de données compressées et ne savent ni produire ni utiliser les métadonnées, décrites dans la spécification de format PKZip gérée par PKWare.

Des bibliothèques tierces telles que DotNetZip gèrent les métadonnées dans une archive ZIP. Ils peuvent ou non utiliser la classe System.IO.Compression.DeflateStream () pour produire le flux d'octets compressé. Dans les versions précédentes, par exemple, DotNetZip utilisait le DeflateStream intégré. À partir de la version 1.7, DotNetZip inclut son propre DeflateStream, qui est plus efficace que celui fourni dans le .NET Framework. DeflateStream intégré à DotNetZip permet également à DotNetZip d'être utilisé sur le .NET Compact Framework 2.0, dépourvu de System.IO.Compression.DeflateStream. (il a été ajouté dans Compact Framework 3.5)

Il y a un bon forum sur le site DotNetZip si vous avez d'autres questions. Exemple de code C #:

    try
    {
        using (ZipFile zip = new ZipFile())
        {
            zip.AddDirectory(DirectoryToZip); // recurses subdirs
            zip.Save(Filename);
        }
    }
    catch (System.Exception ex1)
    {
        System.Console.Error.WriteLine("exception: " + ex1);
    }

Depuis .NET 4.5, Microsoft propose ZipArchive dans l’espace de noms System.IO.Compression . Contrairement aux autres classes de cet espace de noms, cependant, comme les flux GZipStream et Deflate , le code ZipArchive nécessite une référence à System.IO. Assemblage Compression.dll .

Son utilisation est relativement simple et le lien ci-dessus vers MSDN fournit de bons exemples.

De plus, Microsoft a créé le package Microsoft Compression NuGet , qui ajoute prise en charge de ZipArchive et des classes associées à Windows Phone 8 et à d'autres bibliothèques de classes portables

Un ancien fil de discussion, je le sais, mais je voudrais signaler que .NET 4.5 a apporté de nombreuses améliorations à system.io.compression. Il peut désormais très bien manipuler les fichiers .zip, même exposer des fichiers individuels dans le zip en tant que flux capables de lire ou d’écrire, sans extraire ni compresser les fichiers.

Oui, je l'ai utilisé dans le passé. J'ai sous-classé DataSet une fois pour que sa persistance se poursuive dans un fichier (via ReadXML / Méthode WriteXML ). En prime, j’ai décidé de le laisser facultativement compressé si vous le souhaitez (ceci, comme vous le savez tous déjà, est extrêmement efficace avec des données textuelles telles que XML).

J'ai utilisé la classe GZipStream . (Je pensais à l'époque que le DeflateStream associé était simplement GZip sans informations d'en-tête, ou quelque chose de ce genre, je suis sûr que quelqu'un pourrait me corriger à ce sujet). Cela fonctionne tout simplement en superposant un autre flux et vous utilisez ensuite GZipStream à sa place. Dans mon cas, c’était une supercherie sur un FileStream.

Compte tenu du MemoryStream la sortie de myDataSet.WriteXML () , j’ai fait quelque chose comme ce qui suit:

if (CompressData)
{
    // Write to memory
    mStream = new MemoryStream();
    Save(mStream);
    mStream.Seek(0, SeekOrigin.Begin);

    // Filter that through a GZipStream and then to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
                             FileMode.OpenOrCreate);
    zipStream = new GZipStream(fStream, CompressionMode.Compress, true);

    Pump(mStream, zipStream);
}
else
{
    // Write straight to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
                             FileMode.OpenOrCreate);
    Save(fStream);
}

Save () et Pump () sont des méthodes simples, comme celles-ci:

private void Pump(Stream input, Stream output)
{
    int n;
    byte[] bytes = new byte[4096]; // 4KiB at a time

    while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
    {
        output.Write(bytes, 0, n);
    }
}

public void Save(Stream stream)
{
    AcceptChanges();

    WriteXml(stream, XmlWriteMode.WriteSchema);
}
    public static void zIpDatabseFile(string srcPath, string destPath)
    {//This is for  Zip a File
        using (var source = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(dest, CompressionMode.Compress))
        {
            source.CopyTo(zip);
        }
    }
    public static void uNzIpDatabaseFile(string SrcPath, string DestPath)
    {// This is for unzip a files.
        using (var source = new FileStream(SrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(DestPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(source, CompressionMode.Decompress))
        {
            zip.CopyTo(dest);
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top