Dateien mit 7-Zip packen / entpacken

    • VB.NET

    Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Krschy.

      Dateien mit 7-Zip packen / entpacken

      Moin,

      hier ein kleines Tutorial, wie man aus einer VB.NET-Anwendung (bei mir ists 2008) heraus Dateien mit der 7-Zip-Konsole packt / entpackt / bearbeitet. Dabei wird 7-Zip als Prozess behandelt.

      VB.NET-Quellcode

      1. Dim SevenZip as New System.Diagnostics.Process
      2. 'Pfad zur 7z.exe
      3. SevenZip.StartInfo.Filename = "C:\Programme\7-Zip\7z.exe"
      4. 'Parameter für die 7z-Konsole
      5. SevenZip.StartInfo.Arguments = "a C:\Testarchiv.zip C:\Datei1.txt C:\Datei2.txt"
      6. SevenZip.Start()


      Weitere Befehle für die Konsole gibts in der 7-zip.chm.
      Wer nun mit der erstellen Zip-Datei oder den entpackten Dateien noch weiterarbeiten möchte, der kann warten, bis die 7-Zip-Konsole fertig ist:

      VB.NET-Quellcode

      1. 'Wartet bis 7-Zip fertig ist (=automat. geschlossen wurde)
      2. SevenZip.WaitForExit()


      Das Programm selbst ist dann für diese Zeit allerdings "eingefroren". Man kann den kompletten Prozess natürlich mit einem BackgroundWorker abwickeln, wodurch das Hauptprogramm weiter genutzt werden kann, der 7-Zip-Thread wartet weiterhin wie gewünscht auf das Beenden der Konsole.

      Weiterhin empfielt sich noch die Überprüfung, ob 7-Zip erfolgreich war oder nicht:

      VB.NET-Quellcode

      1. 'ExitCodes von 7-Zip
      2. Select Case SevenZip.ExitCode
      3. Case 0: MessageBox.Show("7-Zip: Erfolg")
      4. 'hier weitere Prozesse, z.B. Datei-Upload etc.
      5. Case 1: MessageBox.Show("7-Zip: Warnung")
      6. Case 2: MessageBox.Show("7-Zip: schwerer Fehler")
      7. Case 7: MessageBox.Show("7-Zip: Command Line-Fehler")
      8. Case 8: MessageBox.Show("7-Zip: Nicht genügend Speicher")
      9. Case 255: MessageBox.Show("7-Zip: vom Benutzer abgebrochen")
      10. End Select


      Den kompletten Code gibts hier:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Dim SevenZip as New System.Diagnostics.Process
      2. 'Pfad zur 7z.exe
      3. SevenZip.StartInfo.Filename = "C:\Programme\7-Zip\7z.exe"
      4. 'Parameter für die 7z-Konsole
      5. SevenZip.StartInfo.Arguments = "a C:\Testarchiv.zip C:\Datei1.txt C:\Datei2.txt"
      6. SevenZip.Start()
      7. 'Wartet bis 7-Zip fertig ist (=automat. geschlossen wurde)
      8. SevenZip.WaitForExit()
      9. 'ExitCodes von 7-Zip
      10. Select Case SevenZip.ExitCode
      11. Case 0: MessageBox.Show("7-Zip: Erfolg")
      12. 'hier weitere Prozesse, z.B. Datei-Upload etc.
      13. Case 1: MessageBox.Show("7-Zip: Warnung")
      14. Case 2: MessageBox.Show("7-Zip: schwerer Fehler")
      15. Case 7: MessageBox.Show("7-Zip: Command Line-Fehler")
      16. Case 8: MessageBox.Show("7-Zip: Nicht genügend Speicher")
      17. Case 255: MessageBox.Show("7-Zip: vom Benutzer abgebrochen")
      18. End Select

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

      Musste mal bei Google suchen, ob WinRAR Konsolenbefehle unterstützt. Wenn ja, einfach den StartInfo.Filename, StartInfo.Arguments und wenn benötigt die ExitCodes dementsprechend anpassen.
      Aber 7-Zip macht doch alles mit ... 7z, rar, zip und ist auch noch kostenlos. Was will man mehr?! ;)
      Als kleine Anmerkung.
      Prozesse können auch Events auslösen. Dadurch brauchst du keine BGW oder ähnliches und du musst nicht im GUI Thread auf das Resultat warten.
      Man muss nur bedenken, das die Events dann vom "Prozess-Thread" ausgelöst werden und zB nicht ohne Invoke auf die GUI zugreifen können.

      VB.NET-Quellcode

      1. Private WithEvents SevenZip As System.Diagnostics.Process
      2. Sub StartePro
      3. SevenZip = New System.Diagnostics.Process
      4. SevenZip.EnableRaisingEvents = True
      5. SevenZip.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
      6. End Sub
      7. Private Sub SevenZip_Exited(ByVal sender As Object, ByVal e As System.EventArgs) Handles SevenZip.Exited
      8. Select Case SevenZip.ExitCode
      9. Case 0 : MessageBox.Show("7-Zip: Erfolg")
      10. 'hier weitere Prozesse, z.B. Datei-Upload etc.
      11. Case 1 : MessageBox.Show("7-Zip: Warnung")
      12. Case 2 : MessageBox.Show("7-Zip: schwerer Fehler")
      13. Case 7 : MessageBox.Show("7-Zip: Command Line-Fehler")
      14. Case 8 : MessageBox.Show("7-Zip: Nicht genügend Speicher")
      15. Case 255 : MessageBox.Show("7-Zip: vom Benutzer abgebrochen")
      16. End Select
      17. End Sub


      Gruß Mono

      (ich find das Tut gut, find gut das 7ZIP die Konsolenvariante kostenlos anbietet, Winzip hat das auch, aber dafür benötigst du eine Lizenz meines Wissens. Funktioniert aber genauso gut)
      Das ist meine Signatur und sie wird wunderbar sein!
      Ich werd aus dem hier nicht schlau:

      >> SevenZip.StartInfo.Arguments = "a C:\Testarchiv.zip C:\Datei1.txt C:\Datei2.txt"
      Das mit >> Testarchiv.zip << ist klar, aber C:\Datei1.txt C:\Datei2.txt nicht.
      Was soll hier angegeben werden? Die Datei wo es entpackt werden soll? Wenn ja: Warum Datei1 und Datei2?
      ?(

      Lord Maul schrieb:

      Ich werd aus dem hier nicht schlau:

      >> SevenZip.StartInfo.Arguments = "a C:\Testarchiv.zip C:\Datei1.txt C:\Datei2.txt"
      Das mit >> Testarchiv.zip << ist klar, aber C:\Datei1.txt C:\Datei2.txt nicht.
      Was soll hier angegeben werden? Die Datei wo es entpackt werden soll? Wenn ja: Warum Datei1 und Datei2?
      ?(

      ich denke, er fügt einem vorhanden archiv die dateien datei1.txt und datei2.txt hinzu.

      lg Gugi
      Hi
      habe das Problem das ich irgendwie einen Ordner mit Unterordner und Dateien nicht packen kann kommt immer... 7-Zip: Warnung
      Habe schon alles mögliche ausprobiert.....

      VB.NET-Quellcode

      1. Dim weltname1 As String
      2. Dim weltname2 As String
      3. Dim appdata_new As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
      4. Dim appdata As String = appdata_new & "\" & ".minecraft" & "\" & "saves"
      5. Dim SevenZip As New System.Diagnostics.Process
      6. Dim exe_pfad As String
      7. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
      8. weltname1 = "a " & appdata & "\" & "new.zip " & appdata & "\" & weltname2
      9. SevenZip.StartInfo.FileName = exe_pfad
      10. 'Parameter für die 7z-Konsole
      11. SevenZip.StartInfo.Arguments = weltname1
      12. SevenZip.Start()
      13. 'Wartet bis 7-Zip fertig ist (=automat. geschlossen wurde)
      14. SevenZip.WaitForExit()
      15. Select Case SevenZip.ExitCode
      16. Case 0 : MessageBox.Show("7-Zip: Erfolg")
      17. 'hier weitere Prozesse, z.B. Datei-Upload etc.
      18. Case 1 : MessageBox.Show("7-Zip: Warnung")
      19. Case 2 : MessageBox.Show("7-Zip: schwerer Fehler")
      20. Case 7 : MessageBox.Show("7-Zip: Command Line-Fehler")
      21. Case 8 : MessageBox.Show("7-Zip: Nicht genügend Speicher")
      22. Case 255 : MessageBox.Show("7-Zip: vom Benutzer abgebrochen")
      23. End Select
      24. End Sub
      25. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      26. 'Name Check
      27. If TextBox2.Text = "" Then
      28. PictureBox1.Visible = True
      29. Else
      30. weltname2 = TextBox2.Text
      31. 'Zip Vorgang starten
      32. BackgroundWorker1.RunWorkerAsync()
      33. End If
      34. End Sub
      Könnte mir wer sagen, WO man hier angibt ob entpackt oder gepackt werden soll?
      Mfg: Gather
      Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


      Osiris85 schrieb:

      VB.NET-Quellcode

      1. SevenZip.StartInfo.Arguments = "a C:\Testarchiv.zip C:\Datei1.txt C:\Datei2.txt"

      Also wenn per Argument, dann bitte die Übergabepfade escapen, falls Whitespace im Pfad ist.

      VB.NET-Quellcode

      1. SevenZip.StartInfo.Arguments = String.Format("a {0}{1}{0} {0}{2}{0} {0}{3}{0}","""", targetFile, firstFile, secondFile)
      Von meinem iPhone gesendet