Listar arquivos de um FTP utilizando C# no LATROMI

Olá,

Gostaria de uma ajuda com um código C# para listar os arquivos que estão dentro de um FTP e inseri-los em uma tabela dentro de um formulário.

Tenho o código C# que funciona no Visual Studio como pode ser visto na tabela abaixo, porém, não estou conseguindo reescreve-lo para carregar em uma objeto no LATROMI e visualizar o resultado na tela.

Segue o código que estou utilizando.

using System;
using System.IO;
using System.Net;

namespace Examples.System.Net
{
    public class WebRequestGetExample
    {
        public static void Main()
        {
			string Tabela = "";
			List<string> liArquivos = new List<string>();
			//Cria comunicação com o servidor
			//Definir o diretório a ser listado
			FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp:// {Endereço do FTP}");
			//Define que a ação vai ser de listar diretório
			request.Method = WebRequestMethods.Ftp.ListDirectory;
			//Credenciais para o login (usuario, senha)
			request.Credentials = new NetworkCredential("{Usuário}", "{Senha}");
			//modo passivo
			request.UsePassive = true;
			//dados binarios
			request.UseBinary = true;
			//setar o KeepAlive para true
			request.KeepAlive = true;

			using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
			{
				//Criando a Stream para pegar o retorno
				Stream responseStream = response.GetResponseStream();
				using (StreamReader reader = new StreamReader(responseStream))
				{
					//Adicionar os arquivos na lista
					liArquivos = reader.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList<string>();
				}
			}

			//Criar a tabela
			Tabela = "<table>\n";
			foreach (string item in liArquivos)
			{
				//Console.WriteLine(item + "\n");
				Tabela = Tabela + "<tr><td>" + item + "</td><td><button type='submit'>Baixar</button></td></tr>\n";
			}
			Tabela = Tabela + "</table>";

		// Inserir a lista em uma variável ou objeto no LATROMI	
                  Console.WriteLine(Tabela);
		}
	}
}

Poderiam me ajudar a adaptar o código para o LATROMI?

1 curtida

Olá @Framos!

Poucos ajustes são necessários para que este código seja executado nos Formulários do LATROMI.

Seguem as modificações que precisam ser feitas:

  • Remover o using do namespace System, pois ele já está implicitamente em uso.

  • Remover a declaração de namespace, class e de método, já que o código será envolvido em métodos e classes internas do Formulário.

  • Utilizar o nome completo (qualificado) da classe System.Environment, pois já existe uma classe Environment no código interno do Formulário.

  • Esse item é uma melhoria: Fazer o “dispose” da variável responseStream utilizando a declaração de escopo using.

  • Por último, ao invés de usar Console.WriteLine, atribua o código HTML da variável Tabela a um campo do tipo HtmlElement dessa forma:

    Fields["elmArquivos"].Value = Tabela;
    

Segue o código completo:

using System.IO;
using System.Net;

string Tabela = "";
List<string> liArquivos = new List<string>();
//Cria comunicação com o servidor
//Definir o diretório a ser listado
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://{Endereço do FTP}");
//Define que a ação vai ser de listar diretório
request.Method = WebRequestMethods.Ftp.ListDirectory;
//Credenciais para o login (usuario, senha)
request.Credentials = new NetworkCredential("{Usuário}", "{Senha}");
//modo passivo
request.UsePassive = true;
//dados binarios
request.UseBinary = true;
//setar o KeepAlive para true
request.KeepAlive = true;

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
    //Criando a Stream para pegar o retorno
    using(Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream))
    {
        //Adicionar os arquivos na lista
        liArquivos = reader.ReadToEnd().Split(System.Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList<string>();
    }
}

//Criar a tabela
Tabela = "<table>\n";
foreach (string item in liArquivos)
{
    //Console.WriteLine(item + "\n");
    Tabela = Tabela + "<tr><td>" + item + "</td><td><button type='submit'>Baixar</button></td></tr>\n";
}
Tabela = Tabela + "</table>";

// Insere elemento "table" no campo do tipo HtmlElement
Fields["elmArquivos"].Value = Tabela;

Para maiores informações sobre como utilizar código C# no LATROMI, acesse:

2 curtidas

Obrigado por ajudar @daniel.giacomelli deu certo.

Agora é só trabalhar na formatação dos itens da tabela, também vou utilizar o post Como extrair um arquivo de um diretório FTP? - Suporte - LATROMI Community para abrir os arquivos caso seja necessários.

Obrigado :+1:t5:

2 curtidas

Boa noite @daniel.giacomelli poderia me ajudar a corrigir o erro abaixo?

Erro Conexão FTP

Esse erro esta ocorrendo sempre que tento rodar o código C# logada com o endereço direto do servidor:

Você poderia me ajudar?

@Framos este erro corre ao listar ou ao tentar baixar o arquivo?
Se for na hora de baixar o arquivo, poste o código C# que você está usando.

Talvez seja uma questão de proxy também. Dê uma olhada neste link do Stackoverflow sobre como passar os dados do Proxy - C# webclient and proxy server - Stack Overflow

using (WebClient request = new WebClient())
{
   WebProxy proxy = new WebProxy();
   proxy.Address = new Uri("mywebproxyserver.com");
   proxy.Credentials = new NetworkCredential("usernameHere", "pa****rdHere");
   proxy.UseDefaultCredentials = false;
   proxy.BypassProxyOnLocal = false;  //still use the proxy for local addresses

   // Passa as configurações de proxy
   request.Proxy = proxy;
    
   // Passa usuário e senha do FTP.
   request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
    
   // Faz download do arquivo
   request.DownloadFile(ftpfullpath, outputfilepath);   
}
2 curtidas

Boa tarde @daniel.giacomelli.

Estou muito feliz com resultado que estou tendo no meu formulário que manipula o FTP.

Porem, gostaria de uma ajuda com tratamento de erro no código C#.

Gostaria de saber como posso realizar um tratamento de erros utilizando try catch onde a mensagem de erro seja personalizada.

procurei em alguns sites, porem, não consegui reproduzir os exemplos.

poderia me ajudar com isso?

Meu código esta assim.

using System.IO;
using System.Net;
using LATROMI.Extensions;

var vEndereco   = Convert.ToString(Variables["vEndereco"].Value);           // Endereço FTP
var vPorta      = Convert.ToInt32(Variables["vPorta"].Value);               // Porta do FTP
var vPasta      = Convert.ToString(Variables["vPasta"].Value);              // Diretorio onde estão os arquivos
var vUser       = Convert.ToString(Variables["vUsuario"].Value);            // Usuario do FTO
var vPass       = Convert.ToString(Variables["vSenha"].Value);              // Senha

var vExtencoes   = Convert.ToString(Variables["vExtencoes"].Value);         //  Captura o range de extenções e transforma em uma lista para teste os itens do FTP
string[] vExtencaoList = vExtencoes.Split(',');                             //  Lista de Extenções cadastrada na tabela FTP


var vUsuario    = Convert.ToString(Variables["vUserSessao"].Value);         // Usuario que esta com a sessão aberta
var vConta      = Convert.ToString(Variables["vConta"].Value);              // Conta do usuario para inseriros arquivos no banco de dados

var vLink = "ftp://" + vEndereco + vPasta;                                  // Endereço do FTP ate o diretorio

List<string> liArquivos = new List<string>();

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(vLink);            //Cria comunicação com o servidor já com apontando para o diretorio que será acessado 
request.Method = WebRequestMethods.Ftp.ListDirectory;                       //Define que a ação vai ser de listar diretório
request.Credentials = new NetworkCredential(vUser, vPass);                  //Credenciais para o login (usuario, senha)

request.UsePassive = true;                                                  //modo passivo
request.UseBinary = true;                                                   //dados binarios
request.KeepAlive = true;                                                   //setar o KeepAlive para true


            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()){
                using(Stream responseStream = response.GetResponseStream())             //Criando a Stream para pegar o retorno
                using (StreamReader reader = new StreamReader(responseStream)){
                        liArquivos = reader.ReadToEnd().Split(System.Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList<string>();  //Adicionar os arquivos na lista
                }  
            }

            using (var connection = Database.CreateConnection("Banco_BR")){
                connection.ExecuteNonQuery("BEGIN DELETE FROM tbl_file WHERE CONTA = '"+ vConta +"' AND USUARIO = '"+vUsuario+"'; END;");
                    foreach (string item in liArquivos){  // Lista com todos os arquivos da pasta FTP
                                foreach (var vExtencao in vExtencaoList){  // Teste da extenção valida
                                        bool vFile = item.Contains(vExtencao);
                                        if (vFile){   
                                            var itemBd = item.Replace("pdf/", "");
                                            connection.ExecuteNonQuery("BEGIN INSERT INTO tbl_file (id,nome,usuario,conta,CAMINHO) VALUES (FTPFILE.nextval,'"+ itemBd +"','"+ vUsuario +"','"+ vConta +"','"+vLink+"/"+itemBd+"'); END;");
                                        }
                                }        
                    }        
            }
2 curtidas

Olá @Framos! Consegui resolver o erro anterior?

Quanto ao try / catch, basta colocá-lo em qualquer bloco após as declarações using. Você pode alimentar uma variável com a descrição de erro e depois mostrá-la em uma mensagem:

using System.IO;
using System.Net;
using LATROMI.Extensions;

string erro = "";

try
{
    // Seu código aqui
}
catch (FileNotFoundException fileNotFoundEx) 
{   // Primeiro, faz o "Catch" pelos tipos de exceptions específicos. 
    // "FileNotFoundException " é um exemplo disso.
    erro = $"Arquivo não encontrado: {fileNotFoundEx.FileName}";
}
catch (Exception ex) 
{
    // Por último, faz o "Catch" das exceptions bases. 
    // "Exception" é o tipo herdado por todas as outras exceptions, 
    // portanto sempre vai cair aqui no final.
    erro = $"Ocorre um erro do tipo {ex.GetType().FullName}: {ex.Message}";
}

Para tratar diferentes tipos de erros, você precisa conhecer qual o tipo de cada Exception para adicionar um try / catch para ela. Você pode descobrir o tipo com o código ex.GetType().FullName que coloquei no exemplo.

Pelo fato de todas as Exceptions herdarem de System.Exception, todas terão as propriedades Message (com a mensagem de erro), e InnerException (com outra Exception caso seja erros aninhados), mas alguns tipos podem ter propriedades adicionais, como por exemplo FileName na Exception Systen.IO.FileNotFoundException.

Você vai precisar conhecer cada tipo de Exception para explorar as suas opções. Procure elas na documentação da Microsoft ou no site do Fornecedor caso seja uma biblioteca de terceiros.

Segue a lista de algumas Exceptions:

1 curtida