DotNetZip: Ajouter des fichiers à un répertoire d’archivage créé dynamicment

Je ne peux pas imaginer que c’est difficile à faire, mais je n’ai pas réussi à le faire fonctionner. J’ai une classe de fichiers qui stocke simplement l’emplacement, le répertoire et le nom des fichiers que je veux compresser. Les fichiers que je compresse existent sur le disque, donc FileLocation est le chemin complet. ZipFileDirectory n’existe pas sur le disque. Si j’ai deux éléments dans ma liste de fichiers,

{ FileLocation = "path/file1.doc", ZipFileDirectory = @"\", FileName = "CustomName1.doc" }, { FileLocation = "path/file2.doc", ZipFileDirectory = @"\NewDirectory", FileName = "CustomName2.doc" } 

Je m’attendrais à voir MyCustomName1.doc à la racine et un dossier nommé NewDirectory contenant MyCustomName2.doc, mais ce qui se passe, c’est qu’ils se retrouvent tous deux à la racine avec le code suivant:

 using (var zip = new Ionic.Zip.ZipFile()) { foreach (var file in files) { zip.AddFile(file.FileLocation, file.ZipFileDirectory).FileName = file.FileName; } zip.Save(HttpContext.Current.Response.OutputStream); } 

Si j’utilise ceci:

 zip.AddFiles(files.Select(o => o.FileLocation), false, "NewDirectory"); 

Ensuite, il crée le nouveau répertoire et place tous les fichiers à l’intérieur, comme prévu, mais je perds la possibilité d’utiliser le nommage personnalisé avec cette méthode. De plus, il introduit davantage de complexités que la première méthode gérerait parfaitement.

Existe-t-il un moyen d’obtenir que la première méthode (AddFile ()) fonctionne comme prévu?

Après un examen approfondi, depuis que j’ai posté un commentaire il y a quelques minutes, je soupçonne que la définition de FileName efface le chemin de l’archive.

Les tests le confirment.

Définir le nom sur @ “NewDirectory \ CustomName2.doc” résoudra le problème.

Vous pouvez également utiliser @ “\ NewDirectory \ CustomName2.doc”

Je ne sais pas si cela correspond exactement à vos besoins, mais je pensais le partager. C’est une méthode qui fait partie d’une classe d’aide que j’ai créée pour faciliter un peu le travail avec DotNetZip pour mon équipe de développeurs. La classe IOHelper est une autre classe d’assistance simple que vous pouvez ignorer.

  ///  /// Create a zip file adding all of the specified files. /// The files are added at the specified directory path in the zip file. ///  ///  /// If the zip file exists then the file will be added to it. /// If the file already exists in the zip file an exception will be thrown. ///  /// A collection of paths to files to be added to the zip. /// The fully-qualified path of the zip file to be created. /// The directory within the zip file where the file will be placed. /// Ex. specifying "files\\docs" will add the file(s) to the files\docs directory in the zip file. /// Delete the zip file if it already exists. public void CreateZipFile(ICollection filePaths, ssortingng zipFilePath, ssortingng directoryPathInZip, bool deleteExisting) { if (deleteExisting) { IOHelper ioHelper = new IOHelper(); ioHelper.DeleteFile(zipFilePath); } using (ZipFile zip = new ZipFile(zipFilePath)) { foreach (FileInfo filePath in filePaths) { zip.AddFile(filePath.FullName, directoryPathInZip); } zip.Save(); } }