Dateien mit 7-Zip packen / entpacken

    • VB.NET

      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

      Codenascher und Programmator :whistling: ... steigt auf C# um!

      [Langzeitprojekt] ELENA - Hausautomatisierung und Infotainment-Center

      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?! ;)
      Codenascher und Programmator :whistling: ... steigt auf C# um!

      [Langzeitprojekt] ELENA - Hausautomatisierung und Infotainment-Center
      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!

      Puiscel schrieb:

      Ist das ganze denn erlaubt das dann so zu verwenden?

      ich denke schon, und wenn nicht könnte man das entpacken auch so machen: [VB.NET] Zip-Datei ohne externe Tools entpacken.
      ob das mit dem packen auch so geht weis ich nicht.

      lg Gugi
      Bei Winrar gibts das natürlich auch: WinRAR - Hilfe.zip <-- WinRAR Hilfe
      Da muss man das öffnen:
      RemoteSteuerung 3.0: 51%
      Status: Hintergrundvorgänge

      Ich habe mal eine Frage.

      Als ich versucht habe, einen Ordner mit mehrfachen Unterordnern und Dateien zu packen, hat es das nicht getan.

      Ich möchte gern wissen, wieso das so ist.

      Gruß Smackdown. :D
      Besucht meinen YouTube Kanal & meine Website

      Auf meinem YouTube Kanal & meiner Website, gibt es Video Tutorials zu den Themen Linux, Windows & Security.


      YouTube Kanal:
      youtube.com/user/SecureOne1000

      Website: secureone1000.de/
      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?
      ?(
      Bli Bla Blubb: 12%

      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!


      Die neue MetroSuite, jetzt im Showroom!
      Status

      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)
      Kein HP DeskJet bei mir als Avatar.
      Hmm. Geht das auch ohne 7Zip u. Co zu haben.
      Etwas interenes wie eine Dll mit einer API oder sowas in der Art.
      Weil nicht jeder User hat immer 7Zip oder WinRar und so weiter..

      Gibt es auch einen anderen Weg ?

      Krschy schrieb:

      Weil nicht jeder User hat immer 7Zip oder WinRar und so weiter..

      7z.exe und 7z.dll (als x86-Version) mitliefern?
      Kein HP DeskJet bei mir als Avatar.