Imports System.IO
Imports System.Net

Public Class Form1

    Inherits System.Windows.Forms.Form

    ' Przechowuje ścieżkę do katalogu pokazywanego w kontrolce ListView
    Private CurrentPath As String

    Private Sub cmdQuery_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles cmdQuery.Click
        ' Sprawdzamy, czy adres URI jest prawidłowy
        Dim RequestUri As Uri = ValidateUri(txtFtpSite.Text)
        If RequestUri Is Nothing Then Return

        ' Usuwamy zawartość kontrolki ListView
        listDir.Items.Clear()

        ' Tworzymy nowe żądanie FTP przy użyciu adresu URI
        Dim Request As FtpWebRequest
        Request = CType(WebRequest.Create(RequestUri), FtpWebRequest)

        Request.UsePassive = False

        ' Używamy tego żądania do pobrania zawartości katalogu
        Request.Method = "LIST"
        'FtpMethods.ListDirectoryDetails()

        Dim Response As FtpWebResponse
        Dim ResponseStream As Stream
        Dim Reader As StreamReader
        Try
            ' Wykonujemy polecenie i pobieramy odpowiedź
            Response = CType(Request.GetResponse(), FtpWebResponse)
            Debug.WriteLine("Stan" & Response.StatusDescription)

            ' Odczytujemy odpowiedź wiersz po wierszu
            ResponseStream = Response.GetResponseStream()
            Reader = New StreamReader(ResponseStream, System.Text.Encoding.UTF8)
            Dim Line As String
            Do
                Line = Reader.ReadLine()
                If Line <> "" Then
                    Debug.WriteLine(Line)

                    ' Wyodrębniamy z wiersza nazwę pliku lub katalogu
                    Dim ListItem As New ListViewItem(Line.Substring(59).Trim())
                    If Line.Substring(0, 1) = "d" Then
                        ListItem.ImageKey = "Folder"
                    Else
                        ListItem.ImageKey = "File"
                    End If
                    listDir.Items.Add(ListItem)
                End If

            Loop Until Line = ""

            ' Operacja przebiegła pomyślnie. Zapisujemy bieżącą ścieżkę FTP
            CurrentPath = RequestUri.ToString()

        Catch Ex As Exception
            MessageBox.Show(Ex.Message)

        Finally
            ' Robimy porządki
            If Reader IsNot Nothing Then Reader.Close()
            If Response IsNot Nothing Then Response.Close()

        End Try
    End Sub

    Private Sub cmdDownload_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles cmdDownload.Click

        ' Sprawdzamy, czy adres URI jest prawidłowy
        Dim RequestUri As Uri = ValidateUri(txtFtpSite.Text)
        If RequestUri Is Nothing Then Return

        ' Prosimy użytkownika o wybór docelowego folderu
        ' Domyślnie nazwa pliku jest taka sama jak w serwerze FTP
        dlgSave.FileName = Path.GetFileName(txtFtpSite.Text)
        If dlgSave.ShowDialog() <> Windows.Forms.DialogResult.OK Then
            Return
        End If

        ' Tworzymy nowe żądanie FTP na podstawie adresu URI
        Dim Request As FtpWebRequest
        Request = CType(WebRequest.Create(RequestUri), FtpWebRequest)

        Request.UsePassive = False
        ' Używamy tego żądania do pobrania pliku
        Request.Method = "RETR" 'FtpMethods.DownloadFile("")

        Dim Response As FtpWebResponse
        Dim ResponseStream, TargetStream As Stream
        Dim Reader As StreamReader
        Dim Writer As StreamWriter
        Try
            ' Wykonujemy polecenie i pobieramy odpowiedź
            Response = CType(Request.GetResponse(), FtpWebResponse)
            Debug.WriteLine("Stan: " & Response.StatusDescription)
            Debug.WriteLine("Rozmiar pliku: " & Response.ContentLength)

            ' Tworzymy docelowy plik
            TargetStream = New FileStream(dlgSave.FileName, FileMode.Create)
            Writer = New StreamWriter(TargetStream)

            ' Zapisujemy odpowiedź w pliku
            ResponseStream = Response.GetResponseStream()
            Reader = New StreamReader(ResponseStream, System.Text.Encoding.UTF8)
            Writer.Write(Reader.ReadToEnd())

        Catch Err As Exception
            MessageBox.Show(Err.Message)

        Finally
            ' Robimy porządki
            If Reader IsNot Nothing Then Reader.Close()
            If Response IsNot Nothing Then Response.Close()
            If Writer IsNot Nothing Then Writer.Close()
        End Try
        '' Sprawdzamy, czy adres URI jest prawidłowy
        'Dim RequestUri As Uri = ValidateUri(txtFtpSite.Text)
        'If RequestUri Is Nothing Then Return

        '' Umożliwiamy użytkownikowi wybór folderu, w którym zostanie zapisany plik
        'If dlgFolder.ShowDialog() = Windows.Forms.DialogResult.OK Then
        '    Try
        '        ' Pobieramy plik
        '        My.Computer.Network.DownloadFile(RequestUri, _
        '          dlgFolder.SelectedPath)
        '        MessageBox.Show("Pobieranie pliku zakończyło się powodzeniem.")
        '    Catch Ex As Exception
        '        MessageBox.Show(Ex.Message)
        '    End Try

        'End If

    End Sub

    Private Function ValidateUri(ByVal uriText As String) As Uri
        Dim RequestUri As Uri
        Try
            ' Sprawdzamy, czy łańcuch można zinterpretować jako adres URI
            RequestUri = New Uri(uriText)

            ' Sprawdzamy, czy adres URI zaczyna się od "ftp://"
            If RequestUri.Scheme <> Uri.UriSchemeFtp Then
                RequestUri = Nothing
            End If
        Catch
            RequestUri = Nothing
        End Try

        If RequestUri Is Nothing Then
            MessageBox.Show("Błędny adres URI.")
        Else

        End If
        Return RequestUri
    End Function

    Private Sub listDir_SelectedIndexChanged(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles listDir.SelectedIndexChanged
        ' Kiedy użytkownik zaznacza nowy element, dodajemy nazwę
        ' elementu do adresu URI w polu tekstowym
        If listDir.SelectedItems.Count <> 0 Then
            CurrentPath = CurrentPath.TrimEnd("/")
            txtFtpSite.Text = CurrentPath & "/" & listDir.SelectedItems(0).Text
        End If
    End Sub

End Class
