Por fin luego de mucho luchar hemos encontrado la respuesta de este inconveniente que muchos los lectores de nuestro sitio han presentado. Si tienes algún dato que compartir puedes aportar tu información.
Solución:
Sé que esta es una publicación antigua, pero la estoy agregando aquí para futuras referencias. Aquí hay una solución que encontré:
private void DownloadFileFTP()
string inputfilepath = @"C:TempFileName.exe";
string ftphost = "xxx.xx.x.xxx";
string ftpfilepath = "/Updater/Dir1/FileName.exe";
string ftpfullpath = "ftp://" + ftphost + ftpfilepath;
using (WebClient request = new WebClient())
request.Credentials = new NetworkCredential("UserName", "[email protected]");
byte[] fileData = request.DownloadData(ftpfullpath);
using (FileStream file = File.Create(inputfilepath))
file.Write(fileData, 0, fileData.Length);
file.Close();
MessageBox.Show("Download Complete");
Actualizado basado en una excelente sugerencia de Ilya Kogan
La manera más fácil
La forma más trivial de descargar un archivo binario desde un servidor FTP usando .NET Framework es usando WebClient.DownloadFile
:
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.DownloadFile(
"ftp://ftp.example.com/remote/path/file.zip", @"C:localpathfile.zip");
Opciones avanzadas
Usar FtpWebRequest
solo si necesitas un mayor control, que WebClient
no ofrece (como encriptación TLS/SSL, monitoreo de progreso, modo de transferencia de texto/ascii, reanudación de transferencias, etc.). La manera fácil es simplemente copiar un flujo de respuesta FTP a FileStream
usando Stream.CopyTo
:
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:localpathfile.zip"))
ftpStream.CopyTo(fileStream);
Seguimiento del progreso
Si necesita monitorear el progreso de una descarga, debe copiar los contenidos por partes usted mismo:
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:localpathfile.zip"))
byte[] buffer = new byte[10240];
int read;
while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
fileStream.Write(buffer, 0, read);
Console.WriteLine("Downloaded 0 bytes", fileStream.Position);
Para el progreso de la GUI (WinForms ProgressBar
), ver:
FtpWebRequest Descarga FTP con ProgressBar
Descargando carpeta
Si desea descargar todos los archivos de una carpeta remota, consulte
C# Descargue todos los archivos y subdirectorios a través de FTP.
Este párrafo de la referencia de la clase FptWebRequest podría ser de su interés:
El URI puede ser relativo o absoluto. Si el URI tiene el formato “ftp://contoso.com/%2fpath” (%2f es un ‘/’ con escape), entonces el URI es absoluto y el directorio actual es /path. Sin embargo, si el URI tiene el formato “ftp://contoso.com/ruta”, primero .NET Framework inicia sesión en el servidor FTP (usando el nombre de usuario y la contraseña establecidos por la propiedad Credenciales), luego el directorio actual se establece en /ruta.
Reseñas y calificaciones del post
Ten en cuenta mostrar este post si te ayudó.