Nasz program będzie dosyć uproszczony, nie będę pisał jak zrobić Notifyicon albo jak zrobić aby program odpalał się przy starcie Windowsa bo już o tym pisałem na forum, można do programu zrobić automatykę np: kopia robiona jest w określony dzień tygodnia, miesiąca o określonej godzinie. Wszystko to można znaleźć na blogu dlatego zrobimy sobie tutaj tylko program który będzie robił kopie. Podstawowym zasobem będzie biblioteka której będziemy potrzebować. Można ją ściągnąć tutaj: Ionic.Zip więcej o bibliotece można się dowiedzieć pod adresem : http://dotnetzip.codeplex.com biblioteka jest open sourcowa ale warto przeczytać licencję. Więcej o możliwościach biblioteki można znaleźć w dziale przykładów dotnetzip’a http://dotnetzip.codeplex.com/Examples Wersja dostępna na tym wpisie to wersja 1.8 ponieważ z tą 1.9 miałem kilka problemów. Dobra zaczniemy od dodania Referencji. Tworzymy nowy projekt, rozkładamy jego elementy zgodnie z tabelą poniżej:
Rodzaj elementu | Nazwa elementu | Ustawienia |
---|---|---|
Form | Form1 | Size: 763; 342 Text: Tworzenie kopii zapasowej |
TextBox | Scieszka_folderu_docelowego | Size: 515; 20 Location: 212; 273 Name: Scieszka_folderu_docelowego ReadOnly: True |
Button | Dodaj_Folder | Size: 193; 23 Location: 13; 13 Text: Dodaj folder Name: Dodaj_Folder |
Button | Dodaj_plik | Size: 193; 23 Location: 13; 42 Text: Dodaj plik Name: Dodaj_plik |
Button | Wykonaj_kopie | Location: 13; 167 Enabled: false Size: 193; 23 Text: Wykonaj kopie Name: Wykonaj_kopie |
Button | Dodaj_folder_docelowy | Name: Dodaj_folder_docelowy Size: 193; 23 Location: 12; 238 Text: Folder docelowy |
Button | Usun | Name: Usun Location: 12; 267 Size: 193; 23 Text: Usuń z listy |
TextBox | haslo | Name: haslo Location: 13; 118 Size: 192; 20 |
ListView | Lista_plikow | Location: 212; 12 Size: 515; 249 Widok: Details Dodano jedną kolumnę: -Name: ColumnHeader1 -Text: Pliki i foldery -Width: 489 |
Powinno to wyglądać tak jak na zdjęciu:
aby dodać referencje klikamy prawym przyciskiem myszy na nasz projekt i wybieramy:
w VS2013 Dodaj>>Reference…
W VS2012 Dodaj Odwołanie….
Teraz wybieramy „Przeglądaj” i znajdujemy miejsce gdzie umieszczony jest nasz plik „Ionic.zip”
Otwieramy teraz kod naszego programu i importujemy bibliotekę:
Imports Ionic.Zip Public Class Form1 (...)
Teraz możemy korzystać z naszego zasobu. Najpierw dodamy aktywność przycisków „Dodaj folder” i „Dodaj plik” Tworzymy do nich uchwyt (klikając na każdy przycisk dwukrotnie). Najpierw musimy zainicjować dwie ogólnie dostępne listy:
Public Class Form1 Dim pliki As New List(Of String) Dim folderDocelowySciezka As String (...)
W jednej będziemy trzymać ścieżki do naszych plików a w drugim ścieżkę do pliku docelowego kopii (miejsce trzymania spakowanych plików). Teraz odpowiednio dla przycisku dodającego plik kod wygląda tak:
Private Sub Dodaj_plik_Click(sender As Object, e As EventArgs) Handles Dodaj_plik.Click DodajPlik.Title = "Dodaj plik do listy kopii bezpieczeństwa" DodajPlik.FileName = "" Try With DodajPlik If .ShowDialog() = DialogResult.OK Then Lista_plikow.Items.Add(.FileName) pliki.Add(.FileName) End If End With Catch ex As Exception MsgBox(ex.ToString) End Try End Sub
Pętla jeśli plik będzie wybrany doda jego ścieżkę do listy plików i do ListView. Kod do dodawania folderów wygląda tak:
Private Sub Dodaj_Folder_Click(sender As Object, e As EventArgs) Handles Dodaj_Folder.Click Try With DodajFolder If DodajFolder.ShowDialog() = DialogResult.OK Then Lista_plikow.Items.Add(.SelectedPath) pliki.Add(.SelectedPath) End If End With Catch ex As Exception MsgBox(ex.ToString) End Try End Sub
Działa on identycznie jak poprzedni. Obie metody działają używając Dialogów dodanych do formy
Teraz dodamy kod do przycisku wybierającego folder docelowy naszej kopii:
Private Sub Dodaj_folder_docelowy_Click(sender As Object, e As EventArgs) Handles Dodaj_folder_docelowy.Click Try With FolderDocelowy If FolderDocelowy.ShowDialog() = DialogResult.OK Then Scieszka_folderu_docelowego.Text = FolderDocelowy.SelectedPath folderDocelowySciezka = FolderDocelowy.SelectedPath Wykonaj_kopie.Enabled = True End If End With Catch ex As Exception MsgBox(ex.ToString) End Try End Sub
Ścieżka pliku docelowego będzie widoczna w textboxie pod listą plików.
Zajmiemy się teraz kodem usuwającym pliki z listy wygląda on tak:
Private Sub Usun_Click(sender As Object, e As EventArgs) Handles Usun.Click For Each i As ListViewItem In Lista_plikow.SelectedItems Lista_plikow.Items.Remove(i) Next pliki.Clear() For Each elements In Lista_plikow.Items pliki.Add(elements.text) Next End Sub
Kod ten najpierw usunie z listy ścieżkę do pliku następnie wyczyści nam naszą listę plików i załaduje ją ponownie na podstawie tego co znajdzie w listview.
Teraz stworzymy kod który będzie nam pakował te wszystkie pliki, wygląda on tak:
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Wykonaj_kopie.Click Dim data As String data = Format(Date.Now(), "dd-MM-yyyy") '' Pobieraz z systemu aktualną datę Dim zipPath As String = folderDocelowySciezka + "\" + data + ".zip" 'ścieżka do naszego noewgo pliku *.zip If pliki.Count > 0 Then 'jeśli w liście istnieją jakieś pliki pętla będzie wykonywana Using zip1 As New ZipFile 'tworzy plik zip If Not haslo.Text = "" Then 'jeśli textbox z hasłem nie jest pusty, pętla ustawi dla naszego pliku zip hasło zip1.Password = haslo.Text End If For Each file In pliki If System.IO.File.Exists(file) Then zip1.UpdateFile(file, "pliki") 'dodaje do naszego pliku zip1 nasze pliki i umieszcza je wewnątrz folderu "pliki" ElseIf System.IO.Directory.Exists(file) Then Dim parts As String() = file.Split(New Char() {"\"c}) zip1.UpdateDirectory(file, parts(parts.Count - 1)) 'dodaje do pliku zip wybrane foldery End If Next zip1.Save(zipPath) 'zapisuje nasz plik zip używając ścieżki zipPath End Using Else MsgBox("Nie dodałeś żadnych plików do listy") End If End Sub
Teraz można wypróbować nasz program. Efekt przedstawiam na filmie i na zdjęciu:
Nasz plik zip można zabezpieczyć hasłem i tylko osoba znająca hasło będzie mogła go otworzyć. Jak to wygląda można zobaczyć na filmie:
Pełen projekt do pobrania można dostać tutaj: kopia_zapasowa