web-dev-qa-db-fra.com

Dossier Zip en C #

Qu'est-ce qu'un exemple (code simple) montrant comment compresser un dossier en C #?


Mettre à jour:

Je ne vois pas l'espace de noms ICSharpCode. J'ai téléchargé ICSharpCode.SharpZipLib.dll mais je ne sais pas où copier ce fichier DLL. Que dois-je faire pour voir cet espace de noms?

Et avez-vous un lien pour cet exemple MSDN pour le dossier compressé, car je lis tous les MSDN mais je ne trouve rien.


OK, mais j'ai besoin des informations suivantes.

Où devrais-je copier ICSharpCode.SharpZipLib.dll pour voir cet espace de noms dans Visual Studio?

58
Marko

Cette réponse change avec .NET 4.5. Créer un fichier Zip devient incroyablement facile . Aucune bibliothèque tierce ne sera nécessaire.

string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.Zip";
string extractPath = @"c:\example\extract";

ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
93
Jarrett Meyer

Depuis le fichier DotNetZip help, http://dotnetzip.codeplex.com/releases/

using (ZipFile Zip = new ZipFile())
{
   Zip.UseUnicodeAsNecessary= true;  // utf-8
   Zip.AddDirectory(@"MyDocuments\ProjectX");
   Zip.Comment = "This Zip was created at " + System.DateTime.Now.ToString("G") ; 
   Zip.Save(pathToSaveZipFile);
}
48
Simon

Rien dans la BCL ne permet de faire cela à votre place, mais il existe deux excellentes bibliothèques pour .NET qui prennent en charge cette fonctionnalité.

J'ai utilisé les deux et je peux dire que les deux sont très complets et ont des API bien conçues, c'est donc une question de préférence personnelle.

Je ne sais pas s'ils prennent explicitement en charge l'ajout de Folders plutôt que de fichiers individuels à des fichiers Zip, mais il devrait être assez facile de créer quelque chose qui itérera de manière récursive sur un répertoire et ses sous-répertoires à l'aide de DirectoryInfo et FileInfo classes.

21
Noldorin

Dans .NET 4.5, le fichier ZipFile.CreateFromDirectory (startPath, zipPath); Cette méthode ne couvre pas un scénario dans lequel vous souhaitez compresser un certain nombre de fichiers et de sous-dossiers sans avoir à les placer dans un dossier. Ceci est valable lorsque vous souhaitez que le fichier de décompression place les fichiers directement dans le dossier actuel.

Ce code a fonctionné pour moi:

public static class FileExtensions
{
    public static IEnumerable<FileSystemInfo> AllFilesAndFolders(this DirectoryInfo dir)
    {
        foreach (var f in dir.GetFiles())
            yield return f;
        foreach (var d in dir.GetDirectories())
        {
            yield return d;
            foreach (var o in AllFilesAndFolders(d))
                yield return o;
        }
    }
}

void Test()
{
    DirectoryInfo from = new DirectoryInfo(@"C:\Test");
    using (FileStream zipToOpen = new FileStream(@"Test.Zip", FileMode.Create))
    {
        using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
        {
            foreach (FileInfo file in from.AllFilesAndFolders().Where(o => o is FileInfo).Cast<FileInfo>())
            {
                var relPath = file.FullName.Substring(from.FullName.Length+1);
                ZipArchiveEntry readmeEntry = archive.CreateEntryFromFile(file.FullName, relPath);
            }
        }
    }
}

Les dossiers n'ont pas besoin d'être "créés" dans l'archive Zip. Le deuxième paramètre "entryName" dans CreateEntryFromFile doit être un chemin relatif. Lors de la décompression du fichier Zip, les répertoires des chemins relatifs seront détectés et créés.

8
Gil Roitto

Il existe une classe ZipPackage dans l'espace de noms System.IO.Packaging intégré à .NET 3, 3.5 et 4.0.

http://msdn.Microsoft.com/en-us/library/system.io.packaging.zippackage.aspx

Voici un exemple d'utilisation . http://www.codeproject.com/KB/files/ZipUnZipTool.aspx?display=Print

5
dr.

Il existe un article sur MSDN qui contient un exemple d'application permettant de compresser et d'extraire des fichiers et des dossiers uniquement en C #. J'utilise certaines de ces classes avec succès depuis longtemps. Le code est publié sous la licence Microsoft Permissive, si vous devez savoir ce genre de chose.

EDIT: Merci à Cheeso de m'avoir fait remarquer que je suis un peu en retard. L'exemple MSDN que j'ai cité utilise en fait DotNetZip et est vraiment très complet ces jours-ci. Basé sur mon expérience d'une version précédente de ceci, je le recommanderais avec plaisir.

SharpZipLib est également une bibliothèque assez mature, très appréciée par les utilisateurs, et est disponible sous licence GPL. Cela dépend vraiment de vos besoins en matière de compression et de la façon dont vous visualisez les termes de la licence pour chacun d’entre eux.

Riches

4
Xiaofu

en utilisant DotNetZip (disponible sous forme de paquet nuget):

public void Zip(string source, string destination)
{
    using (ZipFile Zip = new ZipFile
    {
        CompressionLevel = CompressionLevel.BestCompression
    })
    {
        var files = Directory.GetFiles(source, "*",
            SearchOption.AllDirectories).
            Where(f => Path.GetExtension(f).
                ToLowerInvariant() != ".Zip").ToArray();

        foreach (var f in files)
        {
            Zip.AddFile(f, GetCleanFolderName(source, f));
        }

        var destinationFilename = destination;

        if (Directory.Exists(destination) && !destination.EndsWith(".Zip"))
        {
            destinationFilename += $"\\{new DirectoryInfo(source).Name}-{DateTime.Now:yyyy-MM-dd-HH-mm-ss-ffffff}.Zip";
        }

        Zip.Save(destinationFilename);
    }
}

private string GetCleanFolderName(string source, string filepath)
{
    if (string.IsNullOrWhiteSpace(filepath))
    {
        return string.Empty;
    }

    var result = filepath.Substring(source.Length);

    if (result.StartsWith("\\"))
    {
        result = result.Substring(1);
    }

    result = result.Substring(0, result.Length - new FileInfo(filepath).Name.Length);

    return result;
}

Utilisation:

Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest");

Ou

Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest\output.Zip");
1
Amen Ayach

Le code suivant utilise un composant tiers Zip de Rebex :

// add content of the local directory C:\Data\  
// to the root directory in the Zip archive
// (Zip archive C:\archive.Zip doesn't have to exist) 
Rebex.IO.Compression.ZipArchive.Add(@"C:\archive.Zip", @"C:\Data\*", "");

Ou si vous souhaitez ajouter plus de dossiers sans avoir besoin d'ouvrir et de fermer l'archive plusieurs fois:

using Rebex.IO.Compression;
...

// open the Zip archive from an existing file 
ZipArchive Zip = new ZipArchive(@"C:\archive.Zip", ArchiveOpenMode.OpenOrCreate);

// add first folder
Zip.Add(@"c:\first\folder\*","\first\folder");

// add second folder
Zip.Add(@"c:\second\folder\*","\second\folder");

// close the archive 
Zip.Close(ArchiveSaveAction.Auto);

Vous pouvez télécharger le composant Zip ici .

L'utilisation d'une licence gratuite LGPL SharpZipLib est une alternative courante.

Disclaimer: Je travaille pour Rebex

1
Martin Vobr

"Where should I copy ICSharpCode.SharpZipLib.dll to see that namespace in Visual Studio?"

Vous devez ajouter le fichier dll en tant que référence dans votre projet. Cliquez avec le bouton droit sur Références dans l'explorateur de solutions -> Ajouter une référence -> Parcourir, puis sélectionnez la dll.

Enfin, vous devrez l’ajouter sous la forme d’une instruction using dans le fichier dans lequel vous souhaitez l’utiliser.

0
AndrewC

ComponentPro Zip peut vous aider à accomplir cette tâche. L'extrait de code suivant compresse les fichiers et les répertoires d'un dossier. Vous pouvez également utiliser le masque wilcard.

using ComponentPro.Compression;
using ComponentPro.IO;

...

// Create a new instance.
Zip zip = new Zip();
// Create a new Zip file.
Zip.Create("test.Zip");

Zip.Add(@"D:\Temp\Abc"); // Add entire D:\Temp\Abc folder to the archive.

// Add all files and subdirectories from 'c:\test' to the archive.
Zip.AddFiles(@"c:\test");
// Add all files and subdirectories from 'c:\my folder' to the archive.
Zip.AddFiles(@"c:\my folder", "");
// Add all files and subdirectories from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2", "22");
// Add all .dat files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2", "22", "*.dat");
// Or simply use this to add all .dat files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2\*.dat", "22");
// Add *.dat and *.exe files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2\*.dat;*.exe", "22");

TransferOptions opt = new TransferOptions();
// Donot add empty directories.
opt.CreateEmptyDirectories = false;
Zip.AddFiles(@"c:\abc", "/", opt);

// Close the Zip file.
Zip.Close();

http://www.componentpro.com/doc/Zip a plus d'exemples

0
Alexey Semenyuk