Zip-Datei ohne externe Tools entpacken.

    • VB.NET

    Es gibt 78 Antworten in diesem Thema. Der letzte Beitrag () ist von MRBD69.

      Zip-Datei ohne externe Tools entpacken.

      Hallo Leute,

      wer wollte nicht schon lange - Zip-Dateien - ohne Verwendung von externen Tools entpacken.
      Windows kann das ja auch - zumindest einige Versionen davon - z.B. Windows Xp und Windows Vista !

      Nachdem ich gestern abend mit putzen, kochen und backen fertig war, hab ich einfach nochmal ein bischen im Netz gesurft und bin über einen interessanten VB6 Code zum Thema entpacken gestolpert.
      Wer kennt nicht die nette Funktion, mit welcher man ohne Unzip Tools Zip-Dateien entpacken kann ?
      Eine echte Windows Funktion.

      Nach ein bischen Recherche im Netz bin ich auf die Interfaces gestossen, die ich dafür brauche.

      Für alle die schlecht im genau lesen sind hier die Verweise die hinzugefügt werden müssen als Fett-Schrift.

      Für das Beipspiel wird ein Verweis auf die Shell32.dll aus dem System32 Ordner benötigt.

      VB.NET-Quellcode

      1. Imports Shell32
      2. Imports System
      3. Imports System.IO
      4. Public Class ClassUnzip
      5. Private _file As String
      6. Private _folder As String
      7. Private _towhere As String
      8. Private _shell As Shell32.IShellDispatch2
      9. ''' <summary>Event welches vor dem Entpacken (Unzip) ausgeführt wird.</summary>
      10. ''' <remarks></remarks>
      11. Public Event Unzipstart()
      12. ''' <summary>Event welches nach dem Entpacken (Unzip) ausgeführt wird.</summary>
      13. ''' <remarks></remarks>
      14. Public Event UnzipFinishd()
      15. ''' <summary>Neue Instanz der ClassUnzip Klasse.</summary>
      16. ''' <param name="file">Datei welche entpackt werden soll.</param>
      17. ''' <param name="towhere">Zielordner.</param>
      18. ''' <remarks></remarks>
      19. Public Sub New(ByVal file As String, ByVal towhere As String)
      20. _file = file
      21. _towhere = towhere
      22. _folder = Path.Combine(Path.GetDirectoryName(_file), _towhere)
      23. _shell = CreateObject("Shell.Application")
      24. End Sub
      25. ''' <summary>Das Entpacken (Unzip) wird ausgeführt.</summary>
      26. ''' <returns></returns>
      27. ''' <remarks></remarks>
      28. Public Function UnzipNow() As Boolean
      29. 'prüfen ob der ordner existiert
      30. If Directory.Exists(_folder) = False Then
      31. Directory.CreateDirectory(_folder)
      32. End If
      33. 'event für start feuern
      34. RaiseEvent Unzipstart()
      35. 'entpacken
      36. Dim temp As Shell32.Folder = _shell.NameSpace((_folder))
      37. If temp IsNot Nothing Then
      38. temp.CopyHere(_shell.NameSpace((_file)).Items)
      39. End If
      40. 'event für ende feuern
      41. RaiseEvent UnzipFinishd()
      42. 'rückgabe wert setzen
      43. Return True
      44. End Function
      45. ''' <summary>Gibt den Namen der gepackten Datei zurück, oder setzt diesen.</summary>
      46. ''' <value></value>
      47. ''' <returns></returns>
      48. ''' <remarks></remarks>
      49. Public Property UnZipFile() As String
      50. Get
      51. Return _file
      52. End Get
      53. Set(ByVal value As String)
      54. _file = value
      55. End Set
      56. End Property
      57. ''' <summary>Gibt den Zielort (entpacken) zurück, oder setzt diesen.</summary>
      58. ''' <value></value>
      59. ''' <returns></returns>
      60. ''' <remarks></remarks>
      61. Public Property UnzipTo() As String
      62. Get
      63. Return _towhere
      64. End Get
      65. Set(ByVal value As String)
      66. _towhere = value
      67. End Set
      68. End Property
      69. End Class

      Wer das ganze einfach mal testen will, kann folgenden Code für die Windows Form hernehmen.

      VB.NET-Quellcode

      1. Imports System
      2. Imports System.IO
      3. Public Class Form1
      4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      5. Using ofd As New OpenFileDialog
      6. ofd.Filter = "ZipFile|*.zip"
      7. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
      8. Dim file As String = ofd.FileName
      9. Dim cu As New ClassUnzip(file, Path.Combine(Path.GetDirectoryName(file), "test_unzip_folder"))
      10. AddHandler cu.UnzipFinishd, AddressOf Unziped
      11. cu.UnzipNow()
      12. End If
      13. End Using
      14. End Sub
      15. Private Sub Unziped()
      16. MessageBox.Show("Unzipping finished")
      17. End Sub
      18. End Class

      Viel Spass damit.

      Wer fragen oder Anregungen hat, möge sich melden.

      EDIT:
      Code der Form geändert - jetzt bekommt man das Ende des entpackens als Meldung bestätigt.

      Gruss

      mikeb69

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

      Ey man Mike das is ja mal wieder so endgeil von dir, immer diese ganzen Tuts...man die sind so hilfreich immer^^.....
      konnte es leider noch net testen, bin grad an meinem Mac online aba mach ich morgen^^

      MFG...MrLee

      Keine PN's bezüglich VB an mich! Dafür gibt es das Forum!

      :Kreis hier. Kreis da.:

      eine frage: werden vorhandene dateien überschrieben?

      EDIT: Habs ausprobiert, leider kommt dann der typische dialog: Soll diese Datei überschrieben werden?
      kann man das irgendwie abschalten, sodass die dateien direkt überschrieben werden?
      | Keine Fragen per PN oder Skype.

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

      Das ist echt krass von dir, deine Tut's sind alle gut :)

      Habe jedoch ein Fehler:

      VB.NET-Quellcode

      1. Imports System
      2. Imports System.IO
      3. Public Class Form1
      4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      5. Using ofd As New OpenFileDialog
      6. ofd.Filter = "ZipFile|*.zip"
      7. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
      8. Dim file As String = ofd.FileName
      9. Dim cu As New ClassUnzip(file, Path.Combine(Path.GetDirectoryName(file), "test_unzip_folder"))
      10. cu.UnzipNow()
      11. End If
      12. End Using
      13. End Sub
      14. End Class


      Bei mir steht "der Typ "ClassUnzip" ist nicht definiert!"

      Edit: Problem gelöst :D
      Bei mir funzt das ganze nicht :(

      Ich benutz das ganze Ding so:

      VB.NET-Quellcode

      1. Private Sub Entpack()
      2. Using ofd As New OpenFileDialog
      3. ofd.Filter = "Zip-Datei|*.zip"
      4. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
      5. Dim file As String = ofd.FileName
      6. Dim cu As New ClassUnzip(ofd.FileName, Opath)
      7. cu.UnzipNow()
      8. End If
      9. End Using
      10. End Sub


      Ich kann die Datei zwar auswählen, aber dann seh nur noch meine Form1 und dann passiert da nicht mehr

      Und die Datei ist nicht da

      Enten Mann schrieb:

      LOL 8|

      Das Tutorial ist da um zu zeigen wie man ZIPs entpackt, lern lesen
      Ist zwar schon etwas älter... Aber lern du doch mal lesen xD
      Er hat gefragt, ob man ZIPs auch Packen und nicht Entpacken kann.
      Bei mir gehts komischerweise ohne einen Verweis auf die Shell32.dll :D
      hab mich da rumgeärgert und rumgemacht und habs dann einfach rausgeschmissen und jetz gehts. eigenartig. ?(

      EDIT: X( X( X( X( X( ich hab DEN VERWEIS NICHT GESEHEN!!!!! NEIN! geht doch nicht

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

      Funktioniert leider nicht.
      Beim Entpacken bekomme ich folgende Meldung:

      Quellcode

      1. System.Reflection.TargetInvocationException wurde nicht behandelt.
      2. Message="Ein Aufrufziel hat einen Ausnahmefehler verursacht."
      3. Source="mscorlib"
      4. StackTrace:
      5. bei System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
      6. bei System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
      7. bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
      8. bei System.Delegate.DynamicInvokeImpl(Object[] args)
      9. bei System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
      10. bei System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
      11. bei System.Threading.ExecutionContext.runTryCode(Object userData)
      12. bei System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
      13. bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
      14. bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
      15. bei System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
      16. bei System.Windows.Forms.Control.InvokeMarshaledCallbacks()
      17. bei System.Windows.Forms.Control.WndProc(Message& m)
      18. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      19. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      20. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
      21. bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
      22. bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
      23. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
      24. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
      25. bei System.Windows.Forms.Application.Run(ApplicationContext context)
      26. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
      27. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
      28. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
      29. bei iConvert_Updater.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
      30. bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
      31. bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
      32. bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
      33. bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
      34. bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
      35. bei System.Threading.ThreadHelper.ThreadStart()
      36. InnerException: System.NullReferenceException
      37. Message="Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
      38. Source="iConvert Updater1"
      39. StackTrace:
      40. bei iConvert_Updater.ClassUnzip.UnzipNow() in C:\Dokumente und Einstellungen\Benutzer1\Eigene Dateien\Visual Studio 2008\Projects\iConvert Updater1\iConvert Updater1\Form1.vb:Zeile 84.
      41. bei iConvert_Updater.frm_Main.Updater_DownloadFileCompleted(Object sender, AsyncCompletedEventArgs e) in C:\Dokumente und Einstellungen\Benutzer1\Eigene Dateien\Visual Studio 2008\Projects\iConvert Updater1\iConvert Updater1\Form1.vb:Zeile 12.
      42. bei System.Net.WebClient.OnDownloadFileCompleted(AsyncCompletedEventArgs e)
      43. bei System.Net.WebClient.DownloadFileOperationCompleted(Object arg)
      44. InnerException:
      Mein Code sieht so aus:

      VB.NET-Quellcode

      1. Dim uZip As New ClassUnzip("iConvert.zip", Application.StartupPath)
      2. uZip.UnzipNow()

      VB2008Lover schrieb:

      Gibts auch ne möglichkeit zips zu packen?
      klar schaue dir mal die folgende imports klasse ab vb.2005 an...
      da kannste komprimieren und entpacken...

      Quellcode

      1. ....
      2. Imports System.IO.Compression
      3. ...
      4. Sub CompressFile(ByVal path As String)
      5. Dim SF As FileStream = File.OpenRead(path)
      6. Dim DF As FileStream = File.Create(path + ".zip")
      7. Dim buffer(SF.Length) As Byte
      8. SF.Read(buffer, 0, buffer.Length)
      9. Using compress As New GZipStream(DF, CompressionMode.Compress)
      10. compress.Write(buffer, 0, buffer.Length)
      11. End Using
      12. SF.Close()
      13. DF.Close()
      14. End Sub


      Gruss
      nick_XxX
      Bei mir funktioniert das nicht so ganz....
      Ich benutze diesen Code:

      VB.NET-Quellcode

      1. Dim cu As New ClassUnzip("update.zip", Path.Combine(Path.GetDirectoryName("update.zip"), "NewVersion"))
      2. cu.UnzipNow()


      Ich versteh ja nicht mal für was ich das GetDirectoryName brauche.
      Also das "update.zip" ist im gleichen ordner wie die .exe
      Könntet ihr mir den Code bitte so "umformen", das die Datei "update.zip" in den Ordner "NewVersion" entpackt wird.

      Wenn ich das mit dem Code mach, sind dann einfach keine Dateien im Ordner....