2008-10-13 11 views
13

J'utilise le code suivant, en utilisant la bibliothèque SharpZipLib, pour ajouter des fichiers à un fichier .zip, mais chaque fichier est stocké avec son chemin complet. Je dois seulement stocker le fichier, dans la racine du fichier .zip.SharpLibZip: Ajouter un fichier sans chemin

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file); 
    } 
    zipFile.CommitUpdate(); 
} 

Je ne trouve rien à propos d'une option dans la documentation fournie. Comme c'est une bibliothèque très populaire, j'espère que quelqu'un qui lit ceci peut savoir quelque chose.

Répondre

21

Ma solution a été de définir la propriété d'objet NameTransform du ZipFile à un ZipNameTransform avec son TrimPrefix défini dans le répertoire du fichier. Cela entraîne la suppression de la partie de répertoire des noms d'entrée, qui sont des chemins de fichier complets.

public static void ZipFolderContents(string folderPath, string zipFilePath) 
{ 
    string[] files = Directory.GetFiles(folderPath); 
    using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
    { 
     zipFile.NameTransform = new ZipNameTransform(folderPath); 
     foreach (string file in files) 
     { 
      zipFile.BeginUpdate(); 
      zipFile.Add(file); 
      zipFile.CommitUpdate(); 
     } 
    } 
} 

Ce qui est cool est la propriété de NameTransform est de type INameTransform, ce qui permet la personnalisation du nom transforme.

+1

Parfait, c'est exactement ce que je cherchais. Merci! –

+0

Oui, même ici - exactement ce dont j'avais besoin. Merci! –

+0

Merci beaucoup. Après tant de lutte, j'ai pu résoudre mon problème. – Dilip0165

10

Comment utiliser System.IO.Path.GetFileName() combiné avec le paramètre entryName de ZipFile.Add()?

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file, System.IO.Path.GetFileName(file)); 
    } 
    zipFile.CommitUpdate(); 
} 
+1

Il n'y a pas de surcharge avec un paramètre nomEntrée pour ZipFile.Add() lors de l'ajout d'un fichier par nom, mais j'aime votre réflexion. Voir ma réponse ci-dessous. – ProfK

+2

Avez-vous la dernière version de la bibliothèque? Il a une surcharge sur le fichier.add – rjrapson

+2

Je suis assez sûr qu'il y a, au moins dans la dernière version. –

3

L'entrée MSDN pour Directory.GetFiles() indique que Les noms de fichiers renvoyés sont ajoutés au paramètre de chemin fourni. (http://msdn.microsoft.com/en-us/library/07wt70x2.aspx), donc les chaînes que vous passez à zipFile.Add() contiennent le chemin.

Selon la documentation SharpZipLib, il y a une surcharge de la méthode Add,

public void Add(string fileName, string entryName) 
Parameters: 
    fileName(String) The name of the file to add. 
    entryName (String) The name to use for the ZipEntry on the Zip file created. 

Essayez cette approche:

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file, Path.GetFileName(file)); 
    } 
    zipFile.CommitUpdate(); 
} 
+1

Oui, si vous excluez le répertoire du chemin de fichier que vous ajoutez, la méthode Add ne trouvera pas le fichier. Voir ma réponse ci-dessous. – ProfK

Questions connexes