VB .NET - Enviando arquivos para o servidor (FTP) selecionados em um ListBox (drag and drop)


 Neste artigo vou mostrar como enviar arquivos para o servidor via FTP a selecinando os arquivos que foram incluindos em um ListBox via drag and drop.

Neste artigo temos um programa feito na linguagem VB .NET que permite que o usuário defina as configurações de um servidor FTP e a seguir arraste arquivos para um ListBox enviando os arquivos selecionados.

O controle ListBox possui dois eventos que permitem a operação arrastar e soltar , são eles : DragEnter e DragDrop.

DragEnter - ocorre quando você arrasta um objeto dentro dos limites de um controle e é usado para determinar se o objeto que esta sendo arrastado tem a permissão para isto. Um ícone indicando a ocorrência deste evento.

DragDrop - ocorre quando um objeto que esta sendo arrastado sobre o controle é solto sobre o mesmo. Usamos este evento para retornar o objeto através do objeto Data.

Data - o método GetData deste objeto retorna um array de strings que contém o caminho completo dos arquivos que estamos arrastando sobre o controle ListBox.

Para poder habilitar o arrastar e soltar no ListBox devemos definir sua propriedade AllowDrop como true.

Ao arrastar um arquivo para o ListBox, seu manipulador de eventos DragEnter será disparado e ele definirá o parâmetro e.Effect como Copiar se o usuário tiver arrastado um arquivo válido.

Para salvar/restaurar as configurações definidas pelo usuário estamos usando SaveSetting e GetSetting.

Vamos ver como podemos implementar essa lógica usando código VB .NET de uma maneira bem simples.

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2015 Community e crie um novo projeto (File-> New Project) usando a linguagem VB .NET e o template Windows Forms Application.

Informe um nome a seu gosto. Eu vou usar o nome Vbnet_EnviaArquivos

Selecione o formulário Form1.vb e partir da ToolBox inclua os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

Definindo o código para salvar as configurações do usuário

No evento FormClosing do formulário temos o código que salva as configurações do servidor definidas pelo usuário ao encerrar o programa:

    'salva configurações ao sair
    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        SaveSetting(APP_NAME, "Settings", "Host", txtHost.Text)
        SaveSetting(APP_NAME, "Settings", "Directory", txtDiretorio.Text)
        SaveSetting(APP_NAME, "Settings", "UserName", txtUserName.Text)
        SaveSetting(APP_NAME, "Settings", "Password", txtPassword.Text)
    End Sub

Código para restaurar as configurações definidas pelo usuário

No evento Load do formulário temos o código que restaura as configurações salvas:

  'restaura as configurações ao abrir o formulário
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        txtHost.Text = GetSetting(APP_NAME, "Settings", "Host", "")
        txtDiretorio.Text = GetSetting(APP_NAME, "Settings", "Directory", "")
        txtUserName.Text = GetSetting(APP_NAME, "Settings", "UserName", "")
        txtPassword.Text = GetSetting(APP_NAME, "Settings", "Password", "")
    End Sub

Código para incluir os arquivos arrastados no ListBox

No evento DragDrop do Listbox temos o código que adiciona um arquivo arrastado no ListBox e exibe seu nome:

    'evento de arrastar e soltar no listbox
    Private Sub lstArquivos_DragDrop(sender As Object, e As DragEventArgs) Handles lstArquivos.DragDrop
        For Each filename As String In e.Data.GetData(DataFormats.FileDrop, True)
            If Not lstArquivos.Items.Contains(filename) Then
                lstArquivos.Items.Add(filename)
            End If
        Next filename
    End Sub

Este código habilita o botão para conversão apenas se algum valor for digitado na caixa de texto txtGraus e permite que seja digitado somente valores

Código para verificar se o arquivo é válido e copiar os dados

No evento DragEnter temos o código que verifica se o arquivo arrastado é válido e copiar seus dados:

 Private Sub lstArquivos_DragEnter(sender As Object, e As DragEventArgs) Handles lstArquivos.DragEnter
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub

Este código habilita o botão para conversão apenas se algum valor for digitado na caixa de texto txtGraus e permite que seja digitado somente valores

Código do evento Click do botão Enviar

No evento Click do botão Enviar que enviar os arquivos do ListBox :

Private Sub btnEnviar_Click(sender As Object, e As EventArgs) Handles btnEnviar.Click
        Static rodando As Boolean = False
        rodando = Not rodando
        If rodando Then
            Me.Cursor = Cursors.WaitCursor
            ' Cria o caminho do arquivo remoto como: ftp://www.myhost.com/public_html/
            Dim caminho_remoto As String = txtHost.Text
            If Not caminho_remoto.ToLower().StartsWith("ftp://") Then
                caminho_remoto = "ftp://" & caminho_remoto
            End If
            If Not caminho_remoto.EndsWith("/") Then caminho_remoto &= "/"
            caminho_remoto &= txtDiretorio.Text
            If Not caminho_remoto.EndsWith("/") Then caminho_remoto &= "/"
            Dim nome_usuario As String = txtUserName.Text
            Dim senha_usuario As String = txtPassword.Text
            Dim numero_arquivos_copiados As Integer = 0
            Do While lstArquivos.Items.Count > 0
                Try
                    EnviaArquivo(lstArquivos.Items(0), caminho_remoto, nome_usuario, senha_usuario)
                    lstArquivos.Items.RemoveAt(0)
                    numero_arquivos_copiados += 1
                Catch ex As Exception
                    MessageBox.Show(ex.Message, "Erro ao Enviar", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Exit Do
                End Try
                Application.DoEvents()
                If Not rodando Then Exit Do
            Loop
            rodando = False
            Me.Cursor = Cursors.Default
            MessageBox.Show("Foram copiado(s) : " & numero_arquivos_copiados & " arquivo(s)",
                "Done", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

Este código obtém as configurações informadas pelo usuário e chama o método EnviaArquivo() passando o primeiro arquivo selecionado , seu caminho, o nome e senha do usuário.

Após enviar o arquivo ele é removido e o processo se repete até o último arquivo do ListBox.

Observe o uso do recurso  Application.DoEvents()  que processa todas as mensagens do Windows que estão atualmente na fila de mensagens.

O código do método EnviaArquivo() é dado a seguir:

    ' Enviando arquivos
    Private Sub EnviaArquivo(ByVal local_arquivo As String, ByVal caminho_remoto As String, ByVal usuario As String, ByVal senha As String)
        ' Pega o objeto usado para se comunicar com o servidor
        Dim arquivo As New FileInfo(local_arquivo)
        Dim arquivo_remoto As String = caminho_remoto & arquivo.Name
        ' faz uma requisição web
        Dim request As FtpWebRequest = WebRequest.Create(arquivo_remoto)
        request.Method = WebRequestMethods.Ftp.UploadFile
        ' obtem as credenciais do usuário
        request.Credentials = New NetworkCredential(usuario, senha)
        ' Copia o arquivo para um array de bytes
        Dim fonte_stream As New StreamReader(local_arquivo)
        Dim arquivo_bytes As Byte() = Encoding.UTF8.GetBytes(fonte_stream.ReadToEnd())
        fonte_stream.Close()
        request.ContentLength = arquivo_bytes.Length
        ' abre o request stream e escreve os bytes nele
        Dim requestStream As Stream = request.GetRequestStream()
        requestStream.Write(arquivo_bytes, 0, arquivo_bytes.Length)
        requestStream.Close()
        ' verifica  resposta
        Dim resposta As FtpWebResponse = request.GetResponse()
        If Not resposta.StatusDescription.Contains("Arquivo transferido com sucesso") Then
            Dim msg As String = "Erro ao envira arquivo " & local_arquivo & vbCrLf & resposta.StatusDescription
            resposta.Close()
            Throw New Exception(msg)
        End If
        resposta.Close()
    End Sub

No código estamos usando a classe FtpWebRequest que Implementa um cliente de protocolo FTP.

Para obter uma instância de FtpWebRequest, use o método Create. Você também pode usar a classe WebClient para fazer upload e download de informações de um servidor FTP.

Usando qualquer uma dessas abordagens, quando você especificar um recurso de rede que usa o esquema FTP (por exemplo, "ftp://contoso.com") a classe FtpWebRequest fornece a capacidade de interagir programaticamente com servidores de FTP.

Você deve ter um nome de usuário válido e a senha para o servidor FTP ou o servidor deve permitir logon anônimo.

Você pode especificar as credenciais usadas para conectar ao servidor, definindo a propriedade Credentials ou você pode incluí-los na parte UserInfo da URI passada para o método Create. Se você incluir as informações UserInfo na URI, a propriedade Credentials será definida como uma nova credencial de rede com as informações do nome do usuário e e senha especificados.

Você deve ter acesso aos recursos HTTP (WebPermission) para acessar o recurso FTP de outra forma será lançada uma exceção SecurityException.

Pegue o projeto completo aqui :  VBnet_EnviaArquivos.zip

E agora, filhinhos, permanecei nele(Jesus); para que, quando ele se manifestar, tenhamos confiança, e não sejamos confundidos por ele na sua vinda1 João 2:28

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti