vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Dateisystem · Dateien - allgemein   |   VB-Versionen: VB2010 - VB201505.02.18
Verwendung der ZipFile-Klasse mit bspw. Grafiken

Der Tipp stellt Funktionen für die Verwendung von ZIP-Files vor.

Autor:   Dietrich HerrmannBewertung:     [ Jetzt bewerten ]Views:  9.120 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein Beispielprojekt 

Im nachfolgenden Modul sind Funktionen enthalten, mit denen man ZIP-Files erstellen, entpacken und/oder einzelne Files herauslösen kann.

Auf die Anwendung bin ich gestoßen, weil ich sehr verschieden große Bilder/Grafiken geeignet gesammelt zusammenstellen wollte, und zwar nicht in einer ImageList, und weil die Bilder auch ohne Programmänderung austauschbar sein sollten. Natürlich sind noch andere Anwendungen möglich.

Ich zeige hier die Funktionen:

  1. TestZip: zum testen des ZipFiles
  2. ExtractFileFromZip: einzelnes File aus dem ZipFile lösen und in einem Ordner speichern
  3. ExtractAllFilesFrom Zip: alle Files, die im ZipFile enthalten sind, entpacken und in einem Ordner speichern
  4. ExtractAllFileNamesFromZip: alle Filenamen der im ZipFile enthaltenen Files werden in ein Array gespeichert
  5. chgFileNameUml: Hilfsfunktion zur Behandlung deutscher Umlaute in Filenamen

Es hat sich erwiesen, dass beim Speichern von Files in ein ZipFile, deutsche Umlaute nicht übernommen werden, sodass beim Rücklesen eine Umwandlung von Zeichen in Umlaute erfolgen muss. Die Funktionen sind bzgl. File-Filter anpassbar.

Die Anwendung der Funktionen erfordert die Verweise: System.IO.Compression, System.IO.Compression.FileSystem

Hier der Code:

Imports System.IO
Imports System.IO.Compression
 
' erfordert Verweise: System.IO.Compression, System.IO.Compression.FileSystem
 
Module dhmodZipFiles
  ' Verwendung von ZIP-Files (komprimieren, extrahieren)
 
  ' beachten der Umlaute in File-Namen
  Dim umlChrw() As String = {"Ä", "ä", "Ö", "ö", "Ü", "ü"}
  Dim umlAscw() As Integer = {381, 8222, 8482, 8221, 353, 129}
  ''' <summary>
  '''   Gesamten Inhalt eines Ordners in einem Zip-Archiv komprimieren und extrahieren,
  '''   dann Inhalt an einen neuen Ordner
  ''' </summary>
  ''' <param name="startPath">der Pfad der zu komprimierenden Files</param>
  ''' <param name="zipPath">der vollständige Pfad für das ZIP-File</param>
  ''' <param name="extractPath">der vollständige Pfad für zu extrahierende Files</param>
  Public Sub TestZip(startPath As String,
    zipPath As String,
    extractPath As String)
    ' Beispiel:
    ' startPath = "c:examplestart"
    ' zipPath = "c:exampleresult.zip"
    ' extractPath = "c:exampleextract"
    ZipFile.CreateFromDirectory(startPath, zipPath)
    ZipFile.ExtractToDirectory(zipPath, extractPath)
  End Sub
  ''' <summary>
  '''   ein einzelnes File vom ZIP-File extrahieren und speichern in Ordner
  ''' </summary>
  ''' <param name="zipPath">der vollständige Pfad des ZIP-Files</param>
  ''' <param name="extractPath">der Zielpfad für das extrahierte File</param>
  ''' <param name="filename">der Name des zu extrahierenden Files</param>
  ''' <returns>den Namen des extrahierten Files</returns>
  Public Function ExtractFileFromZip(zipPath As String,
                          extractPath As String,
                          filename As String) As String
    Dim changeName As String
    Using archive As ZipArchive = ZipFile.OpenRead(zipPath)
      For Each entry As ZipArchiveEntry In archive.Entries
        changeName = chgFileNameUml(entry.FullName)
        If entry.FullName = filename Then
          entry.ExtractToFile(Path.Combine(extractPath, changeName), True)
          Exit For
        End If
      Next
    End Using
    Return filename
  End Function
  ''' <summary>
  '''   alle Files vom Typ Extension extrahieren und in einen Ordner speichern
  ''' </summary>
  ''' <param name="zipPath">der vollständige Pfad des ZIP-Files</param>
  ''' <param name="extractPath">der Zielpfad für die extrahierten Files</param>
  ''' <param name="fileExt">die Extension als Filter zur File-Auswahl</param>
  Public Sub ExtractAllFilesFromZip(zipPath As String,
    extractPath As String,
    Optional fileExt As String = "*")
    Dim changeName As String, w As Boolean
    w = (fileExt = "*")
    Using archive As ZipArchive = ZipFile.OpenRead(zipPath)
      For Each entry As ZipArchiveEntry In archive.Entries
        If w Then
          changeName = chgFileNameUml(entry.FullName)
          If Not FileExists(If(changeName = "", entry.FullName, changeName)) Then
            entry.ExtractToFile(Path.Combine(extractPath,
                  If(changeName = "", entry.FullName, changeName)))
          End If
        Else
          If entry.FullName.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase) Then
            changeName = chgFileNameUml(entry.FullName)
            If Not FileExists(If(changeName = "", entry.FullName, changeName)) Then
              entry.ExtractToFile(Path.Combine(extractPath,
                  If(changeName = "", entry.FullName, changeName)))
            End If
          End If
        End If
      Next
    End Using
  End Sub
  ''' <summary>
  '''   alle File-Namen vom Typ Extension in einem Array zurückgeben
  ''' </summary>
  ''' <param name="zipPath">der vollständige Pfad des ZIP-Files</param>
  ''' <param name="fileExt">die Extension als Filter zur File-Auswahl</param>
  ''' <returns>das Array der File-Namen</returns>
  Public Function ExtractAllFileNamesFromZip(zipPath As String,
            Optional fileExt As String = "*") As String()
    Dim namesArr() As String, i As Short, changeName As String, w As Boolean
    w = (fileExt = "*")
    Using archive As ZipArchive = ZipFile.OpenRead(zipPath)
      For Each entry As ZipArchiveEntry In archive.Entries
        If w Then
          changeName = chgFileNameUml(entry.FullName)
          i += 1
          ReDim Preserve namesArr(i)
          namesArr(i) = changeName
        Else
          If entry.FullName.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase) Then
            changeName = chgFileNameUml(entry.FullName)
            i += 1
            ReDim Preserve namesArr(i)
            namesArr(i) = changeName
          End If
        End If
      Next
    End Using
    Return namesArr
  End Function
  ''' <summary>
  '''    Entry.Fullname ändern, wenn deutsche Umlaute enthalten
  ''' </summary>
  ''' <param name="theEntryName">der Entry-Punkt-Fullname im ZIP-File</param>
  ''' <returns>den geänderten Namen</returns>
  Private Function chgFileNameUml(theEntryName As String) As String
    Dim a, ix As Integer, chgName As String
    chgName = ""
    For i As Short = 0 To theEntryName.Length - 1
      a = AscW(theEntryName.Substring(i, 1))
      ix = umlAscw.IndexOf(umlAscw, a)
      If ix >= 0 Then
        chgName = theEntryName.Replace(theEntryName.Substring(i, 1), umlChrw(ix))
      End If
    Next
    Return If(chgName = "", theEntryName, chgName)
  End Function
End Module

Viel Erfolg damit!