199 votes

Comment j’ai un fichier ZIP en langage c#, à l’aide d’aucune API 3 rd-party ?

Je suis sûr que ce n'est pas un doublon alors pardonnez-moi juste une minute.

Comment puis-je par programmation (C#) ZIP un fichier (sous Windows) sans l'aide d'un tiers des bibliothèques? J'ai besoin d'un natif de windows appel ou quelque chose comme ça; je n'aime vraiment pas l'idée de départ d'un processus, mais je le ferai si je dois absolument. Un PInovke appel serait beaucoup mieux.

À défaut, permettez-moi de vous dire ce que j'essaye vraiment de le réaliser: j'ai besoin de la capacité de permettre à l'utilisateur de télécharger une collection de documents en une seule requête. Aucune idée sur la façon d'accomplir cette?

362voto

GalacticJello Points 6127

Comment puis-je par programmation (C#) ZIP un fichier (sous Windows) sans l'aide de un tiers des bibliothèques?

Si vous utilisez les 4,5 Cadre, il est maintenant le ZipArchive et ZipFile classes.

using (ZipArchive zip = ZipFile.Open("test.zip", ZipArchiveMode.Create))
{
    zip.CreateEntryFromFile(@"c:\something.txt", "data/path/something.txt");
}

Vous avez besoin d'ajouter des références à:

  • Système.IO.La Compression
  • Système.IO.La Compression.Système de fichiers

88voto

Brian Ensink Points 7579

Êtes-vous à l'aide .NET 3.5? Vous pouvez utiliser l' ZipPackage de la classe et les classes associées. Son plus que juste la compression d'un fichier de la liste parce qu'il veut un type MIME pour chaque fichier que vous ajoutez. Il pourrait faire ce que vous voulez.

Je suis en train d'utiliser ces classes pour un problème similaire à archiver plusieurs fichiers en un seul fichier pour le téléchargement. Nous utilisons une extension de fichier à associer le fichier téléchargé avec notre application de bureau. Un petit problème que nous avons rencontré a été que ce n'est pas possible de simplement utiliser un outil tiers comme 7-zip pour créer les fichiers zip, parce que du côté client, le code ne peut pas l'ouvrir -- ZipPackage ajoute un fichier caché, décrivant le type de contenu de chaque fichier de composant et ne peut pas ouvrir un fichier zip si ce type de contenu du fichier est manquant.

12voto

Joshua Points 2094

J'ai été dans la même situation, de le vouloir .NET au lieu d'un tiers de la bibliothèque. Comme une autre affiche mentionné ci-dessus, simplement à l'aide de la ZipPackage classe (introduit en .NET 3.5) n'est pas assez. Il y a un fichier supplémentaire qui DOIT être inclus dans l'archive pour que le ZipPackage de travail. Si ce fichier est ajouté, alors la résultante ZIP package peut être ouvert directement à partir de l'Explorateur Windows - pas de problème.

Tout ce que vous avez à faire est d'ajouter le [Content_Types].fichier xml à la racine de l'archive avec un "Défaut" nœud pour chaque extension de fichier que vous souhaitez inclure. Une fois ajouté, j'ai pu parcourir le package à partir de l'Explorateur Windows ou par programmation de décompresser et lire son contenu.

Plus d'informations sur le [Content_Types].fichier xml peut être trouvé ici: http://msdn.microsoft.com/en-us/magazine/cc163372.aspx

Voici un échantillon de la [Content_Types].xml (doit être nommé exactement) file:

<?xml version="1.0" encoding="utf-8" ?>
<Types xmlns=
    "http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="xml" ContentType="text/xml" /> 
  <Default Extension="htm" ContentType="text/html" /> 
  <Default Extension="html" ContentType="text/html" /> 
  <Default Extension="rels" ContentType=
    "application/vnd.openxmlformats-package.relationships+xml" /> 
  <Default Extension="jpg" ContentType="image/jpeg" /> 
  <Default Extension="png" ContentType="image/png" /> 
  <Default Extension="css" ContentType="text/css" /> 
</Types>

Et le C# pour la création d'un fichier ZIP:

var zipFilePath = "c:\\myfile.zip"; 
var tempFolderPath = "c:\\unzipped"; 

    using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read)) 
    { 
        foreach (PackagePart part in package.GetParts()) 
        { 
            var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/'))); 
            var targetDir = target.Remove(target.LastIndexOf('\\')); 

            if (!Directory.Exists(targetDir)) 
                Directory.CreateDirectory(targetDir); 

            using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read)) 
            { 
                source.CopyTo(File.OpenWrite(target)); 
            } 
        } 
    } 

Note:

4voto

Tim Scarborough Points 1002

Pour une application .NET 2.0, j’ai utilisé SharpZipLib. Facile à utiliser et open source.

-1voto

Dave Swersky Points 25958

On dirait que Windows pourrait juste vous permettre de faire cette...

Malheureusement, je ne pense pas que vous allez obtenir autour de commencer un processus distinct, sauf si vous allez à une tierce partie composante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X