quinta-feira, 11 de abril de 2019

Linguagem C# - Ftp de Arquivos – Parte 2


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.

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