web-dev-qa-db-fra.com

Comment compresser plusieurs fichiers en utilisant uniquement l'api .net en c #

J'aime compresser plusieurs fichiers qui sont créés dynamiquement dans mon application Web. Ces fichiers doivent être zippés. Pour cela, je ne veux utiliser aucun outil tiers. tout comme pour utiliser .net api en c #

30
Partha
43
Ruben Bartelink

Avec la sortie du .NET Framework 4.5, cela est en fait beaucoup plus facile maintenant avec les mises à jour de System.IO.Compression qui ajoute le classe ZipFile . Il y a un bon walk-through sur codegur ; cependant, les bases sont conformes à l'exemple suivant:

using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.IO.Compression.FileSystem;

namespace ZipFileCreator
{
    public static class ZipFileCreator
    {
        /// <summary>
        /// Create a Zip file of the files provided.
        /// </summary>
        /// <param name="fileName">The full path and name to store the Zip file at.</param>
        /// <param name="files">The list of files to be added.</param>
        public static void CreateZipFile(string fileName, IEnumerable<string> files)
        {
            // Create and open a new Zip file
            var Zip = ZipFile.Open(fileName, ZipArchiveMode.Create);
            foreach (var file in files)
            {
                // Add the entry for each file
                Zip.CreateEntryFromFile(file, Path.GetFileName(file), CompressionLevel.Optimal);
            }
            // Dispose of the object when we are done
            Zip.Dispose();
        }
    }
}

30
rjzii

Je ne suis pas sûr de ce que vous entendez par ne pas vouloir utiliser des outils tiers, mais je suppose que vous ne voulez pas qu'une mauvaise opération le fasse par programme via un autre logiciel.

Je recommande d'utiliser ICSharpCode SharpZipLib

Cela peut être ajouté à votre projet comme référence DLL et est assez simple pour créer des fichiers Zip et les lire.

6
cjk

http://www.codeplex.com/DotNetZip Les codes sources sont disponibles, vous pouvez donc voir comment ils le font et écrire quelque chose de similaire pour vous-même

3
Ray

Fichier Zip simple avec structure plate:

using System.IO;
using System.IO.Compression;

private static void CreateZipFile(IEnumerable<FileInfo> files, string archiveName)
{
    using (var stream = File.OpenWrite(archiveName))
    using (ZipArchive archive = new ZipArchive(stream, System.IO.Compression.ZipArchiveMode.Create))
    {
         foreach (var item in files)
         {
             archive.CreateEntryFromFile(item.FullName, item.Name, CompressionLevel.Optimal);                       
         }
     }
}

Vous devez ajouter une référence à System.IO.Compression et System.IO.Compression.FileSystem

2
Tomas Kubes

Eh bien, vous pouvez compresser les fichiers en utilisant la fonction suivante, vous devez simplement passer les octets de fichier et cette fonction compressera les octets de fichier passés en paramètre et retournera les octets de fichier compressés.

 public static byte[] PackageDocsAsZip(byte[] fileBytesTobeZipped, string packageFileName)
{
    try
    {
        string parentSourceLoc2Zip = @"C:\\\\UploadedDocs"\SG-ACA OCI Packages";
        if (Directory.Exists(parentSourceLoc2Zip) == false)
        {
            Directory.CreateDirectory(parentSourceLoc2Zip);
        }

        //if destination folder already exists then delete it
        string sourceLoc2Zip = string.Format(@"{0}\{1}", parentSourceLoc2Zip, packageFileName);
        if (Directory.Exists(sourceLoc2Zip) == true)
        {
            Directory.Delete(sourceLoc2Zip, true);
        }
        Directory.CreateDirectory(sourceLoc2Zip);



             FilePath = string.Format(@"{0}\{1}",
                    sourceLoc2Zip,
                    "filename.extension");//e-g report.xlsx , report.docx according to exported file

             File.WriteAllBytes(FilePath, fileBytesTobeZipped);




        //if Zip already exists then delete it
        if (File.Exists(sourceLoc2Zip + ".Zip"))
        {
            File.Delete(sourceLoc2Zip + ".Zip");
        }

        //now Zip the source location
        ZipFile.CreateFromDirectory(sourceLoc2Zip, sourceLoc2Zip + ".Zip", System.IO.Compression.CompressionLevel.Optimal, true);

        return File.ReadAllBytes(sourceLoc2Zip + ".Zip");
    }
    catch
    {
        throw;
    }
}

Maintenant, si vous souhaitez exporter ces octets Zip créés pour que l'utilisateur puisse les télécharger, vous pouvez appeler cette fonction en utilisant les lignes suivantes

    Response.Clear();
    Response.AddHeader("content-disposition", "attachment; filename=Report.Zip");
    Response.ContentType = "application/Zip";
    Response.BinaryWrite(PackageDocsAsZip(fileBytesToBeExported ,"TemporaryFolderName"));
    Response.End();
2
Talha Hanjra

DotNetZip est la voie à suivre (dotnetzip.codeplex.com) ... n'essayez pas la bibliothèque d'empaquetage .NET .. trop difficile à utiliser et le [Content_Types] .xml qu'il y met me dérange ..

1
The Pickle

Consultez System.IO.Compression.DeflateStream. Vous trouverez quelques exemples sur msdn http://msdn.Microsoft.com/en-us/library/system.io.compression.deflatestream.aspx

0
Marcom

Vous pouvez toujours appeler un exécutable tiers comme 7-Zip avec une ligne de commande appropriée à l'aide de la classe System.Diagnostics.Process. Il n'y a pas d'interopérabilité de cette façon, car vous demandez simplement au système d'exploitation de lancer un binaire.

0
ajs410