Caro amigo,
neste mês irei explorar a segunda parte do artigo sobre FTP de arquivos
utilizando a linguagem C# junto com a plataforma Windows Forms. No mês passado criamos
uma classe chamada “Ftp”, contendo o método necessário para a realização do
Upload de arquivos. Neste mês de Fevereiro irei ensiná-los a realizar o
“Download” de arquivos deste mesmo servidor. Para isto criarei uma interface
implementando métodos desta mesma classe Ftp.
Utilizaremos
as duas classes descritas no artigo de Janeiro, sendo a: “FtpWebRequest” e a “FtpWebResponse”.
Para maiores detalhes recomendo a leitura da primeira parte deste artigo.
Reutilizando a Classe Ftp
Iremos
implementar mais dois métodos na classe FTP, sendo:
“ListarArquivos”:
Responsável por trazer todos os arquivos contidos no servidor FTP, nos
permitindo fazer a escolha do arquivo a ser baixado.
“Download”:
Rotina necessária para realizar o download do arquivo escolhido.
Deveremos
também implementar mais alguns atributos, como: “ftpResponse”, “ftpStream” e
“bufferSize”.
Ambos os
métodos e atributos serão explicados a seguir.
Declarando os atributos
necessários:
private FtpWebResponse ftpResponse = null;
private Stream ftpStream = null;
private int
bufferSize = 2048;
Na função
“Download” passaremos por parâmetros o caminho do arquivo contido no servidor
FTP e na máquina local. Teremos um retorno booleano para indicar se a rotina
foi realizada ou não com sucesso. Primeiramente instanciamos a classe
“FtpWebRequest” fornecendo o endereço do servidor e local. Para o método
“Credentials” atribuímos o usuário e senha do FTP. Utilizaremos configurações
como “UseBinary” para arquivos binários, “UsePassive” para definir
o comportamento do processo de transferência de dados de um aplicativo, “KeepAlive” para especificar se a conexão de controle para o servidor FTP é fechada depois
que a solicitação for concluída. O próximo passo seria identificar o tipo de
tarefa através do atributo “Method”. Para isto escolheremos “DownloadFile” e
logo em seguida estabelecemos um retorno do servidor FTP através do método
“GetResponse”. O atributo “ftpStream” irá nos auxiliar para testarmos o
“Download” do arquivo através de uma rotina “Try/Catch”. Ver Listagem 01.
public bool Download(string remoteFile, string localFile)
{
try
{
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(enderecoFtp + "/" + remoteFile);
ftpRequest.Credentials = new NetworkCredential(usuario, senha);
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
ftpStream =
ftpResponse.GetResponseStream();
FileStream localFileStream
= new FileStream(localFile, FileMode.Create);
byte[] byteBuffer = new byte[bufferSize];
int bytesRead =
ftpStream.Read(byteBuffer, 0, bufferSize);
try
{
while (bytesRead > 0)
{
localFileStream.Write(byteBuffer, 0, bytesRead);
bytesRead =
ftpStream.Read(byteBuffer, 0, bufferSize);
}
}
catch
{
return false;
}
localFileStream.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;
}
catch
{
return false;
}
return true;
}
Listagem 01.
A
rotina “Listararquivos” possui como parâmetro de entrada o diretório onde os
arquivos se encontram no servidor FTP. Ela nos retorna um Array de Strings,
contendo todos os nomes dos arquivos do endereço fornecido. Iniciamente
utilizaremos exatamente as mesmas opções descritas no método “Download”.
Usaremos o método “WebRequestMethods.Ftp.ListDirectory” para listar os arquivos
do diretório indicado. Iremos ler linha por linha armazenando na variável
“directoryRaw” e separada por um pipe “|”. Por final, retornaremos a variável “directoryList” contendo todos os nomes dos arquivos.
Ver Listagem 02.
public string[]
ListarArquivos(string directory)
{
try
{
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(enderecoFtp
+ "/" + directory);
ftpRequest.Credentials = new NetworkCredential(usuario, senha);
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
ftpStream =
ftpResponse.GetResponseStream();
StreamReader ftpReader = new StreamReader(ftpStream);
string directoryRaw = null;
try
{
while
(ftpReader.Peek() != -1) {
directoryRaw += ftpReader.ReadLine() + "|"; }
}
catch { }
ftpReader.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;
try
{
string[]
directoryList = directoryRaw.Split("|".ToCharArray());
return
directoryList;
}
catch { }
}
catch { }
return new string[] { "" };
}
Listagem 02.
Listagem 02.
Criando um exemplo prático
Nosso
formulário deverá conter a seguinte estrutura: 4 pares de Labels e TextBox
sendo (Endereço Ftp, Usuário, Senha e Download em), um Listbox contendo o
descritivo “Arquivos”, onde serão adicionados os arquivos contidos no servidor
FTP e o botão “Download”, o qual fará o trabalho de baixar o arquivo no servidor
FTP. Ver Imagem 01.
![]() |
Figura 01: Criando a
interface gráfica para consumir a classe Ftp.
|
O método “RecuperarArquivosFTP”, que fará o trabalho de
listar todos os arquivos do servidor FTP através do método “ListarArquivos”
contidos na classe FTP. Invocaremos o mesmo logo após o método
“InitializeComponent”, ou seja, quando carregamos os componentes na tela.
public FrmFTPDownload()
{
InitializeComponent();
RecuperarArquivosFTP();
}
private void RecuperarArquivosFTP()
{
Ftp ftp = new Ftp(txtEndereco.Text,
txtUsuario.Text, txtSenha.Text);
string[] detailDirectoryListing =
ftp.ListarArquivos("/thiago");
for (int i = 0; i <
detailDirectoryListing.Count(); i++)
{
lstArquivos.Items.Add(detailDirectoryListing[i]);
}
}
No evento “Click” do botão “Download” usaremos a função
“consistencias” (Implementada no artigo do mês de Janeiro). Esta função terá
algumas pequenas alterações, como por exemplo a inclusão do campo “Download
em:”, ver código abaixo:
if (txtDownload.Text.Length
<= 0)
{
MessageBox.Show("O campo
Download é de preenchimento obrigatório!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
Por este motivo não incluirei por inteiro a mesma em nosso
artigo deste mês.
Receberemos o nome do arquivo através da seleção do mesmo
no ListBox. Através da instância da classe FTP passaremos para o método
construtor os dados do endereço, usuário e senha e em seguida atribuímos para o
método “Ftp.Download” o caminho absoluto do arquivo
localizado no servidor FTP e o caminho absoluto local. Passaremos uma mensagem
informando se o processo foi realizado com sucesso através do “MessageBox”.
private void btnDownload_Click(object sender, EventArgs e)
{
if (consistencias() == true)
{
String
nomeArquivo = lstArquivos.SelectedItem.ToString();
Ftp ftp = new Ftp(txtEndereco.Text,
txtUsuario.Text, txtSenha.Text);
if
(ftp.Download("thiago/" + nomeArquivo,
txtDownload.Text + nomeArquivo))
MessageBox.Show(string.Format("Download
do arquivo {0} realizado com sucesso!",
nomeArquivo), "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
MessageBox.Show(string.Format("Ocorreu
uma falha no download do arquivo {0}!",
nomeArquivo), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Podemos conferir o exemplo em Run-time na Figura 02.
![]() |
Figura 02: Exemplo em Run-Time. |
Conclusões
Nesta
segunda e última parte aprendemos a implementar o uso de download de arquivos
via FTP. Assim completamos o ciclo completo das principais tarefas envolvendo
FTP através da linguagem C#.
Fica aí a
dica, um abraço e até o mês que vem!
Referências
https://msdn.microsoft.com/pt-br/library/system.net.ftpwebrequest(v=vs.110).aspx
Nenhum comentário:
Postar um comentário