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.
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?
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:
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);
}
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;");
}
}
}
}
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.