vb.net zip Datei erstellen mit mehreren Ordnern

  • VB.NET
  • .NET 5–6

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    vb.net zip Datei erstellen mit mehreren Ordnern

    Hallo ihr lieben
    Ich möchte gerne Daten meines Programmes mithilfe der Zip Funktion des Net Frameworks sichern.
    Dazu habe ich erstmal ein kleines Demo Projekt erstellt.
    Im Debug Ordner der Demo habe ich folgende Verzeichnisstruktur gebastelt:

    \test\

    \test1\Neuer Ordner
    \test1\zupackenderOrdner

    Ich möchte nun den gesamtem Ordner test, sowie alle *.txt Dateien aus \test1\zupackenderOrdner in meiner Zip File auf dem Desktop haben.
    Dabei soll aber die bisherige Verzeichnisstruktur erhalten bleiben - die Textdateien im "zupackenderOrdner" sollen also auch im zip File entsprechend in \test1\zupackenderOrdner liegen.

    alle Textdateien in den entsprechenden Unterordner zu packen gelingt mir, theoretisch.
    Die Code Zeile wird ohne gemecker ausgeführt, aber die Datei (bzw. nichtmal die Ordner) landen im zip.

    Und wie füge ich einem manuell erzeugten Zip einen ganzen Ordner hinzu?

    Hier der gesamte Code:

    VB.NET-Quellcode

    1. Imports System.IO.Compression
    2. Public Class Form1
    3. Private DesktopPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
    4. Private ProgPath As String = Application.StartupPath
    5. Private Sub BTNCreatezip_Click(sender As Object, e As EventArgs) Handles BTNCreatezip.Click
    6. Using newFile = ZipFile.Open(DesktopPath & "\test.zip", ZipArchiveMode.Create)
    7. 'Hier soll der ganze Test Ordner gepackt werden
    8. newFile.CreateEntryFromFile(ProgPath & "\test\qwe.txt", "qwe.txt")
    9. 'folgende Zeile erhält Schleife für alle txt Dateien des Ordners
    10. newFile.CreateEntryFromFile(ProgPath & "\test1\zupackenderOrdner\asd.txt", "\test1\zupackenderOrdner\asd.txt")
    11. newFile.CreateEntry(ProgPath & "\test\")
    12. End Using
    13. End Sub
    14. End Class


    Auch wenn der Code mehr als überschaubar ist, lade ich mal die Solution hoch. Dann braucht ihr nix zum zippen erstellen.
    Dateien
    • ziptest.zip

      (57,72 kB, 50 mal heruntergeladen, zuletzt: )
    @DerSmurf Sieh Dir mal den SolutionExplorer vom @ErfinderDesRades an, da wird das gemacht:
    SolutionExplorer - OpenSource
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    DerSmurf schrieb:

    Ich will aber Ordner auf meinem Laufwerk zipen.
    Du sollst ja nicht den Code verwenden, sondern ansehen und verstehen und dann bei Dir einsetzen. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hmm...
    Ich habe mir den Code zu Gemüte geführt. Ach wenn ich so meine Schwierigkeiten habe, verstehe ich halbwegs was da passiert.
    Aber es wird hier ja letzlich (mit einer anderen Methode als der die ich hier vorgestellt habe (wahrscheinlich weil es diese erst seit NET 4.5 gibt) nur EIN ORDNER gezippt.
    Das sähe ja mit der "neuen" Methode so aus:

    VB.NET-Quellcode

    1. ZipFile.CreateFromDirectory(startPath, zipPath)


    Aber meine "Aufgabenstellung" ist ja eine andere:

    DerSmurf schrieb:

    \test\

    \test1\Neuer Ordner
    \test1\zupackenderOrdner

    Ich möchte nun den gesamtem Ordner test, sowie alle *.txt Dateien aus \test1\zupackenderOrdner in meiner Zip File auf dem Desktop haben.
    Dabei soll aber die bisherige Verzeichnisstruktur erhalten bleiben - die Textdateien im "zupackenderOrdner" sollen also auch im zip File entsprechend in \test1\zupackenderOrdner liegen.

    alle Textdateien in den entsprechenden Unterordner zu packen gelingt mir, theoretisch.
    Die Code Zeile wird ohne gemecker ausgeführt, aber die Datei (bzw. nichtmal die Ordner) landen im zip
    .

    Und wie füge ich einem manuell erzeugten Zip einen ganzen Ordner hinzu?


    edit:
    Der durchgestrichene Teil hat nicht funktioniert, weil ich einen backslash zuviel hatte.
    Ich hab auch gleich die Schleife geschrieben, um alle txt Dateien hinzuzufügen. Das klappt wunderbar.

    VB.NET-Quellcode

    1. Private Sub BTNCreatezip_Click(sender As Object, e As EventArgs) Handles BTNCreatezip.Click
    2. Using newFile = ZipFile.Open(DesktopPath & "\test.zip", ZipArchiveMode.Create)
    3. For Each File As String In Directory.GetFiles(ProgPath & "\test1\zupackenderOrdner\", "*.txt")
    4. Dim fi As New FileInfo(File)
    5. newFile.CreateEntryFromFile(File, "test1\zupackenderOrdner\" & fi.Name)
    6. Next
    7. End Using
    8. End Sub


    Jetzt ist nur die Frage, wie füge ich dieser zip einen kompletten Ordner hinzu?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DerSmurf“ ()

    Also klar. Ich kann zuerst mit der CreateFromDirectory Methode den gesamten Ordner zippen und dann die einzelnen Dateien hinzufügen.
    Also so:

    VB.NET-Quellcode

    1. Private Sub BTNCreatezip_Click(sender As Object, e As EventArgs) Handles BTNCreatezip.Click
    2. If File.Exists(DesktopPath & "\test.zip") Then File.Delete(DesktopPath & "\test.zip")
    3. ZipFile.CreateFromDirectory(ProgPath & "\test\", DesktopPath & "\test.zip", compressionLevel:=CompressionLevel.Optimal, True)
    4. Using newFile = ZipFile.Open(DesktopPath & "\test.zip", ZipArchiveMode.Update)
    5. For Each File As String In Directory.GetFiles(ProgPath & "\test1\zupackenderOrdner\", "*.txt")
    6. Dim fi As New FileInfo(File)
    7. newFile.CreateEntryFromFile(File, "test1\zupackenderOrdner\" & fi.Name)
    8. Next
    9. End Using
    10. End Sub


    Dann habe ich genau das was ich will.
    Problematisch wird es aber, wenn ich einen weiteren (kompletten) Ordner zum zip hinzufügen kann.

    Ich kann mir einfach nicht vorstellen, dass es nicht möglich ist, einen kompletten Ordner zum zip hinzuzufügen, sondern eben nur einzelne Dateien.
    Muss ich einen gesamten Ordner (mit behalten der Verzeichnisstruktur) wirklich so hinzufügen?

    VB.NET-Quellcode

    1. For Each File As String In Directory.GetFiles(ProgPath & "\test", "*", SearchOption.AllDirectories)
    2. Dim ZipFile = File.Replace(ProgPath & "\", "")
    3. newFile.CreateEntryFromFile(File, ZipFile)
    4. Next

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerSmurf“ ()