vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
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:  Views:  9.119 
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!



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.