16 Stimmen

SharpLibZip: Datei ohne Pfad hinzufügen

Ich verwende den folgenden Code, der die SharpZipLib Bibliothek, um Dateien zu einer .zip-Datei hinzuzufügen, aber jede Datei wird mit ihrem vollständigen Pfad gespeichert. Ich muss nur die Datei in der "Root" der ZIP-Datei speichern.

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 in der mitgelieferten Dokumentation nichts über eine entsprechende Option finden. Da es sich um eine sehr beliebte Bibliothek handelt, hoffe ich, dass jemand, der dies liest, etwas weiß.

24voto

ProfK Punkte 46602

Meine Lösung bestand darin, die NameTransform Objekt-Eigenschaft des ZipFile zu einer ZipNameTransform mit seinem TrimPrefix auf das Verzeichnis der Datei gesetzt. Dies bewirkt, dass der Verzeichnisteil der Eintragsnamen, die vollständige Dateipfade sind, entfernt wird.

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

Das Besondere ist, dass die Eigenschaft NameTransform vom Typ INameTransform und ermöglicht die individuelle Anpassung der Namenstransformationen.

12voto

Tamas Czinege Punkte 114595

Wie wäre es mit der Verwendung von System.IO.Path.GetFileName() in Kombination 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();
}

4voto

Treb Punkte 19459

Der MSDN-Eintrag für Directory.GetFiles() stellt fest, dass Die zurückgegebenen Dateinamen werden an den übergebenen Pfadparameter angehängt. ( http://msdn.microsoft.com/en-us/library/07wt70x2.aspx ), so dass die Zeichenketten, die Sie an zipFile.Add() den Pfad enthalten.

Laut der SharpZipLib-Dokumentation gibt es eine Überladung 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 Sie 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();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X