Pakowanie pliku używając System.IO.Packaging

Dzisiaj pokażę jak zrobić program który będzie pakował zipem plik i umieszczał go w wybranym katalogu, a gdy plik będzie istniał to będzie go aktualizował. Zaczynamy od utworzenia nowego projektu i umieszczeniu określonych elementów na wybranych miejscach:

 

Rodzaj elementu Nazwa elementu Ustawienia
Form Form1 Size: 561; 226
Text: Pakowanie z użyciem Packing
Label Label1 Text: Plik do pakowania:
Location: 12; 27
TextBox plik Size: 306; 20
Location: 133; 20
Button Button1 Size: 75;23
Location: 445; 16
Label Label2 Location: 12;75
Text: Miejsce umieszczenia spakowanego pliku:
TextBox miejsce_docelowe Size: 217; 20
Location: 222; 68
Button Button2 Size: 75; 23
Location: 445; 65
Button pakuj Location: 204; 108
Enabled: false
Size: 103; 55
FolderBrowserDialog DodajMiejsceDocelowe Name: DodajMiejsceDocelowe
OpenFileDialog DodajPlik Name: DodajPlik

Po ułożeniu elementów forma powinna wyglądać tak:

packong1 Musimy pamiętać też o dodaniu tych ważnych dwóch elementów:

packong2

Znaleźć je można w przyborniku w zakładce „Okna Dialogowe”. Tworzymy sobie uchwyty dla naszych przycisków dodających plik do spakowania i folder docelowy (klikając dwukrotnie lewym przyciskiem myszy na przycisk) i wypełniamy nasz kod tak jak to jest pokazane poniżej. Przyciski odpowiadają, za dialog z użytkownikiem a jego wybory zapisują w zmiennych „file” i „miejsceDocelowe”.

Public Class Form1
    Dim file As String
    Dim miejsceDocelowe As String

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        DodajPlik.Title = "Wybierz plik który chcesz spakować."
        DodajPlik.FileName = ""
        Try
            With DodajPlik
                If .ShowDialog() = DialogResult.OK Then
                    file = .FileName
                    plik.Text = .FileName
                End If
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Try
            With DodajMiejsceDocelowe
                If DodajMiejsceDocelowe.ShowDialog() = DialogResult.OK Then
                    miejsce_docelowe.Text = .SelectedPath
                    miejsceDocelowe = .SelectedPath
                End If
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class

Teraz dodamy sobie komendę która odblokuje nam nasz przycisk „Pakuj” W chwili wypełnienia powyższych pól. Klikamy dwukrotnie lewym przyciskiem myszy najpierw pierwszy textbox a następnie drugi aby utworzyć zaczepienie w naszym kodzie.

  Private Sub miejsce_docelowe_TextChanged(sender As Object, e As EventArgs) Handles miejsce_docelowe.TextChanged
        If Not plik.Text = "" And Not miejsce_docelowe.Text = "" Then
            pakuj.Enabled = True
        End If
    End Sub

    Private Sub plik_TextChanged(sender As Object, e As EventArgs) Handles plik.TextChanged
        If Not plik.Text = "" And Not miejsce_docelowe.Text = "" Then
            pakuj.Enabled = True
        End If
    End Sub

Po uruchomieniu efekt powinien być jak na obrazku:

packong3

Nad formą dodajemy sobie import naszej paczki:

Imports System.IO.Packaging
Imports System.IO

Public Class Form1
(...)

Jeśli po wpisaniu System.IO.Packing świeci się na zielono trzeba go dodać do Odwołań, w tym celu otwieramy „My Project”, znajdujemy po lewej stronie „Odwołania” i klikamy „Dodaj”

packong4

Znajdujemy „WindowsBase” i stawiamy przy nim fajkę. Teraz możemy bez przeszkód używać paczki.

packong5

Teraz tworzymy uchwyt do naszego przycisku „Pakuj” i wypełniamy go kodem:

    Private Sub pakuj_Click(sender As Object, e As EventArgs) Handles pakuj.Click

        Dim data As String
        data = Format(Date.Now(), "dd-MM-yyyy") ''Nazwą naszego spakowanego pliku będzie aktualna data

        Dim pliczek As String = file
        Dim Z As System.IO.Packaging.ZipPackage
        Dim zipPath As String = miejsceDocelowe + "\" + data + ".zip" 'miejsce w którym pokaże się nasz plik

        ' Tworzymy plik "zip"
        Z = ZipPackage.Open(zipPath, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)

        Dim partUriDocument As Uri = System.IO.Packaging.PackUriHelper.CreatePartUri(New Uri(System.IO.Path.GetFileName(file), UriKind.Relative))
        If Z.PartExists(partUriDocument) Then
            Z.DeletePart(partUriDocument)
        End If
        'tworzy nowy plik
        Dim P = Z.CreatePart(partUriDocument, System.Net.Mime.MediaTypeNames.Application.Zip, IO.Packaging.CompressionOption.Maximum)
        Dim dest As Stream = P.GetStream()
        Using fileStream As New FileStream(file, FileMode.Open, FileAccess.Read)
            fileStream.CopyTo(dest)
        End Using
        Z.Close()
    End Sub

Wygląda to tak jak na obrazku poniżej:

packong6

Pełen projekt do pobrania tutaj: Pakowanie_urzywajac_Packaging

Permalink do tego artykułu: https://visualmonsters.cba.pl/pakowanie-pliku-uzywajac-system-io-packaging/

Dodaj komentarz

Twój adres email nie będzie publikowany.