Feedback

VB - Einfache HelperClass für SharpZipLib

Veröffentlicht von am 8/30/2008
(1 Bewertungen)
Diese HelperClass für die berühmte SharpZipLib (http://sharpdevelop.net/OpenSource/SharpZipLib) verfügt über einfache Funktionen um Dateien und Ordner zu komprimieren und ggf. auch zu entpacken. Diese Klasse funktioniert logischerweise auch nur mit der SharpZipLib. Also muss erst ein Verweis auf diese DLL gesetzt werden bevor man die Funktionen nutzen kann. Es handelt sich hier nicht um eine eigenständige Zip-Klasse.
Option Strict On

Imports ICSharpCode.SharpZipLib
Imports System.IO

Public Class ZipLib

    Private mCompressionLevel As Integer = 6

    Public Property CompressionLevel() As Integer
        Get
            Return mCompressionLevel
        End Get
        Set(ByVal value As Integer)
            mCompressionLevel = value
        End Set
    End Property

    ''' <summary>
    ''' Diese Funktion komprimiert alle Dateien in einem Ordner
    ''' </summary>
    ''' <param name="InputDir">Der Ordner der komprimiert werden soll</param>
    ''' <param name="FileName">Gibt den Namen an nach dem die ZIP Datei benannt werden soll</param>
    ''' <param name="OutputDir">Gibt das Ziel für die ZIP Datei an. Wenn kein Ziel übergeben wurde wird die Datei im Parent Ordner erstellt</param>
    Public Sub CompressDirectory(ByVal InputDir As String, ByVal FileName As String, Optional ByVal OutputDir As String = "")
        Dim Files As New List(Of String)
        Dim RelativePath As String
        GetAllFiles(InputDir, Files)

        If OutputDir = "" Then OutputDir = Path.GetDirectoryName(InputDir)
        If Directory.Exists(OutputDir) = False Then Directory.CreateDirectory(OutputDir)

        Dim ZFS As New FileStream(OutputDir & "\" & FileName, FileMode.Create)
        Dim ZOut As New Zip.ZipOutputStream(ZFS)

        ZOut.SetLevel(6)

        Dim ZipEntry As Zip.ZipEntry

        Dim Buffer(4096) As Byte
        Dim ByteLen As Integer
        Dim FS As FileStream

        Dim ParentDirLen As Integer = InputDir.Length + 1
        For i As Integer = 0 To Files.Count - 1
            'Relativen Pfad für die Zip Datei erstellen
            RelativePath = Files(i).Substring(ParentDirLen)

            'ZipEntry erstellen
            ZipEntry = New Zip.ZipEntry(RelativePath)
            ZipEntry.DateTime = Date.Now

            'Eintrag hinzufügen
            ZOut.PutNextEntry(ZipEntry)

            'Datei in den Stream schreiben
            FS = New FileStream(Files(i), FileMode.Open, FileAccess.Read, FileShare.Read)
            Do
                ByteLen = FS.Read(Buffer, 0, Buffer.Length)
                ZOut.Write(Buffer, 0, ByteLen)
            Loop Until ByteLen <= 0
            FS.Close()
        Next

        ZOut.Finish()
        ZOut.Close()
        ZFS.Close()
    End Sub


    ''' <summary>
    ''' Diese Funktion komprimiert alle angegebenen Dateien die aus einem Ordner stammen und nicht aus unterschiedlichen Ordnern.
    ''' Das hat den zweck falls man einen Ordner komprimieren will jedoch nicht mit allen Dateien sondern nur mit bestimmten Dateien.
    ''' Dadurch bleibt die Ordnerstruktur erhalten wenn das Archiv erstellt wurde. Im Gegenstatz zur Funktion "CompressFiles" die keine Ordnerstrukuren erstellt
    ''' </summary>
    ''' <param name="InputFiles">Die Dateien die komprimiert werden sollen</param>
    ''' <param name="FileName">Gibt den Namen an nach dem die ZIP Datei benannt werden soll</param>
    ''' <param name="OutputDir">Gibt das Ziel für die ZIP Datei an. Wenn kein Ziel übergeben wurde wird die Datei im Parent Ordner erstellt</param>
    Public Sub CompressDirectory(ByVal InputFiles As List(Of String), ByVal FileName As String, ByVal OutputDir As String)
        Dim RelativePath As String

        If Directory.Exists(OutputDir) = False Then Directory.CreateDirectory(OutputDir)

        Dim ZFS As New FileStream(OutputDir & "\" & FileName, FileMode.Create)
        Dim ZOut As New Zip.ZipOutputStream(ZFS)

        ZOut.SetLevel(6)

        Dim ZipEntry As Zip.ZipEntry

        Dim Buffer(4096) As Byte
        Dim ByteLen As Integer
        Dim FS As FileStream

        Dim ParentDirLen As Integer = Path.GetDirectoryName(InputFiles(0)).Length + 1
        For i As Integer = 0 To InputFiles.Count - 1
            'Relativen Pfad für die Zip Datei erstellen
            RelativePath = InputFiles(i).Substring(ParentDirLen)

            'ZipEntry erstellen
            ZipEntry = New Zip.ZipEntry(RelativePath)
            ZipEntry.DateTime = Date.Now

            'Eintrag hinzufügen
            ZOut.PutNextEntry(ZipEntry)

            'Datei in den Stream schreiben
            FS = New FileStream(InputFiles(i), FileMode.Open, FileAccess.Read, FileShare.Read)
            Do
                ByteLen = FS.Read(Buffer, 0, Buffer.Length)
                ZOut.Write(Buffer, 0, ByteLen)
            Loop Until ByteLen <= 0
            FS.Close()
        Next

        ZOut.Finish()
        ZOut.Close()
        ZFS.Close()
    End Sub

    ''' <summary>
    ''' Diese Funktion komprimiert Dateien zu einem ZIP-Archiv.
    ''' </summary>
    ''' <param name="InputFiles">Die Liste mit Dateien die komprimiert werden soll.</param>
    ''' <param name="FileName">Der Dateiname der ZIP-Datei (ohne Pfad).</param>
    ''' <param name="OutputDir">Das Ausgabeverzeichnis wo die ZIP Datei gespeichert werden soll.</param>
    ''' <remarks></remarks>
    Public Sub CompressFiles(ByVal InputFiles As List(Of String), ByVal FileName As String, ByVal OutputDir As String)
        Dim ZFS As New FileStream(OutputDir & "\" & FileName, FileMode.Create)
        Dim ZOut As New Zip.ZipOutputStream(ZFS)

        ZOut.SetLevel(6)

        Dim ZipEntry As Zip.ZipEntry

        Dim Buffer(4096) As Byte
        Dim ByteLen As Integer
        Dim FS As FileStream


        For i As Integer = 0 To InputFiles.Count - 1
            'ZipEntry erstellen
            ZipEntry = New Zip.ZipEntry(Path.GetFileName(InputFiles(i)))
            ZipEntry.DateTime = Date.Now

            'Eintrag hinzufügen
            ZOut.PutNextEntry(ZipEntry)

            'Datei in den Stream schreiben
            FS = New FileStream(InputFiles(i), FileMode.Open, FileAccess.Read, FileShare.Read)
            Do
                ByteLen = FS.Read(Buffer, 0, Buffer.Length)
                ZOut.Write(Buffer, 0, ByteLen)
            Loop Until ByteLen <= 0
            FS.Close()
        Next

        ZOut.Finish()
        ZOut.Close()
        ZFS.Close()
    End Sub

    ''' <summary>
    ''' Diese Funktion dekomprimiert eine ZIP-Datei.
    ''' </summary>
    ''' <param name="FileName">Die Datei die dekomprimiert werden soll.</param>
    ''' <param name="OutputDir">Das Verzeichnis in dem die Dateien dekomprimiert werden sollen.</param>
    Public Sub DecompressFile(ByVal FileName As String, ByVal OutputDir As String)
        Dim ZFS As New FileStream(FileName, FileMode.Open)
        Dim ZIN As New Zip.ZipInputStream(ZFS)

        Dim ZipEntry As Zip.ZipEntry

        Dim Buffer(4096) As Byte
        Dim ByteLen As Integer
        Dim FS As FileStream

        Dim InZipDirName As String
        Dim InZipFileName As String
        Dim TargetFileName As String

        Do
            ZipEntry = ZIN.GetNextEntry
            If ZipEntry Is Nothing Then Exit Do

            InZipDirName = Path.GetDirectoryName(ZipEntry.Name) & "\"
            InZipFileName = Path.GetFileName(ZipEntry.Name)

            If Directory.Exists(OutputDir & "\" & InZipDirName) = False Then Directory.CreateDirectory(OutputDir & "\" & InZipDirName)

            If InZipDirName = "\" Then InZipDirName = ""
            TargetFileName = OutputDir & "\" & InZipDirName & InZipFileName

            FS = New FileStream(TargetFileName, FileMode.Create)
            Do
                ByteLen = ZIN.Read(Buffer, 0, Buffer.Length)
                FS.Write(Buffer, 0, ByteLen)
            Loop Until ByteLen <= 0
            FS.Close()
        Loop

        ZIN.Close()
        ZFS.Close()
    End Sub

    Private Sub GetAllFiles(ByVal Root As String, ByRef FileArray As List(Of String))
        Try
            Dim Files() As String = System.IO.Directory.GetFiles(Root)
            Dim Folders() As String = System.IO.Directory.GetDirectories(Root)

            For i As Integer = 0 To UBound(Files)
                FileArray.Add(Files(i).ToString)
            Next

            For i As Integer = 0 To UBound(Folders)
                GetAllFiles(Folders(i), FileArray)
            Next
        Catch Ex As Exception
        End Try
    End Sub
End Class
Abgelegt unter Zip.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!