2008-10-13 4 views
13

Ich verwende den folgenden Code, der die Bibliothek SharpZipLib verwendet, um Dateien zu einer ZIP-Datei hinzuzufügen, aber jede Datei wird mit dem vollständigen Pfad gespeichert. Ich muss die Datei nur im 'root' der ZIP-Datei speichern.SharpLibZip: Datei ohne Pfad hinzufügen

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

Ich kann nichts über eine Option dafür in der mitgelieferten Dokumentation finden. Da dies eine sehr beliebte Bibliothek ist, hoffe ich, dass jemand, der dies liest, etwas weiß.

Antwort

21

Meine Lösung die NameTransform Objekteigenschaft festgelegt wurde der ZipFile zu einer ZipNameTransform mit seiner TrimPrefix auf das Verzeichnis der Datei gesetzt. Dadurch wird der Verzeichnisteil der Eintragsnamen, die vollständige Dateipfade sind, entfernt.

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(); 
     } 
    } 
} 

Was cool ist, ist das die NameTransform Eigenschaft vom Typ ist INameTransform, so dass Anpassung des Namens verwandelt.

+1

Perfekt, das ist genau das, was ich gesucht habe. Vielen Dank! –

+0

Ja, das gleiche hier - genau das, was ich brauchte. Vielen Dank! –

+0

Vielen Dank. Nach so viel Kampf konnte ich mein Problem lösen. – Dilip0165

10

Wie wäre es mit System.IO.Path.GetFileName() kombiniert mit dem Parameter entryName von 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

Es gibt keine Überladung mit einem Parameter entryName für ZipFile.Add() beim Hinzufügen einer Datei nach Namen, aber ich mag Ihr Denken. Siehe meine Antwort unten. – ProfK

+2

Haben Sie die neueste Version der Bibliothek? Es hat eine Überladung auf der Datei.add – rjrapson

+2

Ich bin mir ziemlich sicher, dass es zumindest in der neuesten Version gibt. –

3

Der MSDN-Eintrag für Directory.GetFiles() besagt, dass Die zurückgegebenen Dateinamen mit dem mitgelieferten Pfad Parameter angehängt werden. (http://msdn.microsoft.com/en-us/library/07wt70x2.aspx), so enthalten die Zeichenfolgen, die Sie an zipFile.Add() übergeben, den Pfad.

Nach der SharpZipLib Dokumentation gibt es eine Überlastung der Add-Methode,

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. 

versuchen, diesen Ansatz:

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

Ja, wenn Sie das Verzeichnis aus dem Dateipfad ausschließen, den Sie hinzufügen, findet die Add-Methode die Datei nicht. Siehe meine Antwort unten. – ProfK