AJUDA COM ACESSO A DIRETÓRIOS E SEUS ARQUIVOS VIA
Alterado em 18/11/2024 18:00:56
Fala galera quanto tempo em , precisando mais uma vez de um help aqui que nem a IA conseguiu me ajudar
preciso baixar do ftp tudo que tem dentro de uma pasta isso tambem inclui subpastas, alguma ideia via c# windows forms.
ja conferir tudo com senhas e usuários tudo certo
public static void backupfolder(string folder) {
string ftpHost = ftppadrao; // URL do servidor FTP
string ftpUsername = userftp;
string ftpPassword = senhaftp;
string remoteFolder = "/public_html/apis_web/" + tokem; // Pasta remota no servidor
string localFolder = folder; // Caminho local para salvar os arquivos
DownloadFtpDirectory(ftpHost, ftpUsername, ftpPassword, remoteFolder, localFolder);
}
public static void DownloadFtpDirectory(string ftpHost, string ftpUser, string ftpPassword, string remoteDir, string localDir) {
// Criar diretório local, se não existir
Directory.CreateDirectory(localDir);
// Listar todos os arquivos e pastas no diretório remoto
var items = ListDirectory(ftpHost, ftpUser, ftpPassword, remoteDir);
foreach(var item in items) {
string remotePath = $ "{ftpHost}/{remoteDir}/{item}";
string localPath = Path.Combine(localDir, item);
if (IsFtpDirectory(ftpHost, ftpUser, ftpPassword, $ "{remoteDir}/{item}")) {
// Diretório encontrado, chamada recursiva
DownloadFtpDirectory(ftpHost, ftpUser, ftpPassword, $ "{remoteDir}/{item}", localPath);
} else {
// Arquivo encontrado, baixar
DownloadFileWithWebClient(ftpHost, ftpUser, ftpPassword, $ "{remoteDir}/{item}", localPath);
}
}
}
private static string[] ListDirectory(string ftpHost, string ftpUser, string ftpPassword, string remoteDir) {
var request = (FtpWebRequest) WebRequest.Create($"{ftpHost}/{remoteDir}");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
request.UsePassive = true; // Ativando modo passivo
using(var response = (FtpWebResponse) request.GetResponse())
using(var stream = response.GetResponseStream())
using(var reader = new StreamReader(stream)) {
var list = reader.ReadToEnd().Split(new [] {
'',
'
'
}, StringSplitOptions.RemoveEmptyEntries);
return list;
}
}
private static void DownloadFileWithWebClient(string ftpHost, string ftpUser, string ftpPassword, string remoteFile, string localFile) {
try {
using(var webClient = new WebClient()) {
webClient.Credentials = new NetworkCredential(ftpUser, ftpPassword);
Console.WriteLine($"Baixando: {remoteFile} para {localFile}");
webClient.DownloadFile(remoteFile, localFile);
}
} catch (WebException ex) {
Console.WriteLine($"Erro ao realizar o download: {ex.Message}");
if (ex.Response != null) {
using(var responseStream = ex.Response.GetResponseStream())
using(var reader = new StreamReader(responseStream)) {
string serverMessage = reader.ReadToEnd();
Console.WriteLine($"Resposta do servidor: {serverMessage}");
}
}
} catch (Exception ex) {
Console.WriteLine($"Erro inesperado: {ex.Message}");
}
}
private static bool IsFtpDirectory(string ftpHost, string ftpUser, string ftpPassword, string remotePath) {
try {
var request = (FtpWebRequest) WebRequest.Create($"{ftpHost}/{remotePath}");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
using(var response = (FtpWebResponse) request.GetResponse()) {
return true; // Se conseguir listar, é um diretório
}
} catch {
return false; // Caso contrário, não é
}
}
preciso baixar do ftp tudo que tem dentro de uma pasta isso tambem inclui subpastas, alguma ideia via c# windows forms.
ja conferir tudo com senhas e usuários tudo certo
public static void backupfolder(string folder) {
string ftpHost = ftppadrao; // URL do servidor FTP
string ftpUsername = userftp;
string ftpPassword = senhaftp;
string remoteFolder = "/public_html/apis_web/" + tokem; // Pasta remota no servidor
string localFolder = folder; // Caminho local para salvar os arquivos
DownloadFtpDirectory(ftpHost, ftpUsername, ftpPassword, remoteFolder, localFolder);
}
public static void DownloadFtpDirectory(string ftpHost, string ftpUser, string ftpPassword, string remoteDir, string localDir) {
// Criar diretório local, se não existir
Directory.CreateDirectory(localDir);
// Listar todos os arquivos e pastas no diretório remoto
var items = ListDirectory(ftpHost, ftpUser, ftpPassword, remoteDir);
foreach(var item in items) {
string remotePath = $ "{ftpHost}/{remoteDir}/{item}";
string localPath = Path.Combine(localDir, item);
if (IsFtpDirectory(ftpHost, ftpUser, ftpPassword, $ "{remoteDir}/{item}")) {
// Diretório encontrado, chamada recursiva
DownloadFtpDirectory(ftpHost, ftpUser, ftpPassword, $ "{remoteDir}/{item}", localPath);
} else {
// Arquivo encontrado, baixar
DownloadFileWithWebClient(ftpHost, ftpUser, ftpPassword, $ "{remoteDir}/{item}", localPath);
}
}
}
private static string[] ListDirectory(string ftpHost, string ftpUser, string ftpPassword, string remoteDir) {
var request = (FtpWebRequest) WebRequest.Create($"{ftpHost}/{remoteDir}");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
request.UsePassive = true; // Ativando modo passivo
using(var response = (FtpWebResponse) request.GetResponse())
using(var stream = response.GetResponseStream())
using(var reader = new StreamReader(stream)) {
var list = reader.ReadToEnd().Split(new [] {
'',
'
'
}, StringSplitOptions.RemoveEmptyEntries);
return list;
}
}
private static void DownloadFileWithWebClient(string ftpHost, string ftpUser, string ftpPassword, string remoteFile, string localFile) {
try {
using(var webClient = new WebClient()) {
webClient.Credentials = new NetworkCredential(ftpUser, ftpPassword);
Console.WriteLine($"Baixando: {remoteFile} para {localFile}");
webClient.DownloadFile(remoteFile, localFile);
}
} catch (WebException ex) {
Console.WriteLine($"Erro ao realizar o download: {ex.Message}");
if (ex.Response != null) {
using(var responseStream = ex.Response.GetResponseStream())
using(var reader = new StreamReader(responseStream)) {
string serverMessage = reader.ReadToEnd();
Console.WriteLine($"Resposta do servidor: {serverMessage}");
}
}
} catch (Exception ex) {
Console.WriteLine($"Erro inesperado: {ex.Message}");
}
}
private static bool IsFtpDirectory(string ftpHost, string ftpUser, string ftpPassword, string remotePath) {
try {
var request = (FtpWebRequest) WebRequest.Create($"{ftpHost}/{remotePath}");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
using(var response = (FtpWebResponse) request.GetResponse()) {
return true; // Se conseguir listar, é um diretório
}
} catch {
return false; // Caso contrário, não é
}
}
Alterado em 18/11/2024 19:18:16
A muitos anos quando criei meu próprio programa de FTP tive esse problema.
Isso porque quando vc lista um diretório FTP ele não traz o tamanho das pastas só dos arquivos. Isso na época e pode variar de servidor pra servidor ainda.
A solução foi ter na grade todos os arquivos do diretório, o usuário seleciona todos os arquivos da pasta arrastando o mouse(datagridview), e o sistema faz o download de um por um.
O CuteFtp faz o Download da pasta inteira, mas acho que é o mesmo processo, ele só abre a pasta faz o dowload dos arquivos e recriar a pasta no seu dir local. Acho que vc pode fazer isso tambem.
Só destacando que isso faz mais de 10 anos, pode ter mudado alguma coisa nesse tempo que eu não saiba, pois não mexi mais nele. Agora utilizo os Bucktes do google coud.
Isso porque quando vc lista um diretório FTP ele não traz o tamanho das pastas só dos arquivos. Isso na época e pode variar de servidor pra servidor ainda.
A solução foi ter na grade todos os arquivos do diretório, o usuário seleciona todos os arquivos da pasta arrastando o mouse(datagridview), e o sistema faz o download de um por um.
O CuteFtp faz o Download da pasta inteira, mas acho que é o mesmo processo, ele só abre a pasta faz o dowload dos arquivos e recriar a pasta no seu dir local. Acho que vc pode fazer isso tambem.
Só destacando que isso faz mais de 10 anos, pode ter mudado alguma coisa nesse tempo que eu não saiba, pois não mexi mais nele. Agora utilizo os Bucktes do google coud.
vlww brow , fiz de outra forma e deu tudo certo vlwww
Tópico encerrado , respostas não são mais permitidas