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. |
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:
5 Labels
5 TextBox
1 Listbox
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 vinda. 1 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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net