Rubrik: Dateisystem · Dateien - allgemein | VB-Versionen: VB2010 - VB2015 | 05.02.18 |
Verwendung der ZipFile-Klasse mit bspw. Grafiken Der Tipp stellt Funktionen für die Verwendung von ZIP-Files vor. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 9.119 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein 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:
- TestZip: zum testen des ZipFiles
- ExtractFileFromZip: einzelnes File aus dem ZipFile lösen und in einem Ordner speichern
- ExtractAllFilesFrom Zip: alle Files, die im ZipFile enthalten sind, entpacken und in einem Ordner speichern
- ExtractAllFileNamesFromZip: alle Filenamen der im ZipFile enthaltenen Files werden in ein Array gespeichert
- 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!