Pues eso… un artículillo "tesnico" para que no digas..
Esto lo publico a raíz de una pregunta en mis foros… y más que nada porque pensaba que ya lo tenía publicado, pero se ve que no… ya que tenía un ejemplo para acceder a un servidor FTP pero sólo para listar el contenido de un directorio FTP.
La cuestión es que en realidad ese código que publiqué con un par de añadidos sirve para poder descargar un archivo (o fichero) de un directorio FTP y aquí te los mostraré tanto para Visual Basic.NET como para Visual C#.
La clase en cuestión que nos sirve para hacer esto que te comento es FtpWebRequest que está definida en el espacio de nombres System.Net.
Y sin más preámbulos (ni rollos) aquí tienes el código de VB y C#.
¡Que lo descargues bien!
Código de VB
'------------------------------------------------------------------------------ ' Descargar archivos de un FTP (06/Dic/11) ' ' ©Guillermo 'guille' Som, 2011 '------------------------------------------------------------------------------ Option Strict On Option Infer On Imports System Imports System.Net Imports System.IO Imports System.Text Module Module1 Sub Main() ' En este ejemplo usamos un FTP público y anónimo ' pero puedes indicar el que quieras descargarFic("ftp://ftp.rediris.es/welcome.msg", _ "anonimous@nadie.com", "", _ "E:\pruebas2") Console.WriteLine("descargado") Console.ReadLine() End Sub Private Sub descargarFic(ByVal ficFTP As String, _ ByVal user As String, ByVal pass As String, _ dirLocal As String) Dim dirFtp As FtpWebRequest = CType(FtpWebRequest.Create(ficFTP), FtpWebRequest) ' Los datos del usuario (credenciales) Dim cr As New NetworkCredential(user, pass) dirFtp.Credentials = cr ' El comando a ejecutar usando la enumeración de WebRequestMethods.Ftp dirFtp.Method = WebRequestMethods.Ftp.DownloadFile ' Obtener el resultado del comando Dim reader As New StreamReader(dirFtp.GetResponse().GetResponseStream()) ' Leer el stream (el contenido del archivo) Dim res As String = reader.ReadToEnd() ' Mostrarlo. 'Console.WriteLine(res) ' Guardarlo localmente con la extensión .txt Dim ficLocal As String = Path.Combine(dirLocal, Path.GetFileName(ficFTP) & ".txt") Dim sw As New StreamWriter(ficLocal, False, Encoding.Default) sw.Write(res) sw.Close() ' Cerrar el stream abierto. reader.Close() End Sub Sub listarFTP(ByVal dir As String, ByVal user As String, ByVal pass As String) Dim dirFtp As FtpWebRequest = CType(FtpWebRequest.Create(dir), FtpWebRequest) ' Los datos del usuario (credenciales) Dim cr As New NetworkCredential(user, pass) dirFtp.Credentials = cr ' El comando a ejecutar dirFtp.Method = "LIST" ' También usando la enumeración de WebRequestMethods.Ftp dirFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails ' Obtener el resultado del comando Dim reader As New StreamReader(dirFtp.GetResponse().GetResponseStream()) ' Leer el stream Dim res As String = reader.ReadToEnd() ' Mostrarlo. Console.WriteLine(res) ' Cerrar el stream abierto. reader.Close() End Sub End Module
Código de C#
//----------------------------------------------------------------------------- // Descargar archivos de un FTP (06/Dic/11) // // ©Guillermo 'guille' Som, 2011 //----------------------------------------------------------------------------- using System; using System.Text; using System.Net; using System.IO; namespace descargar_archivos_FTP_cs { class Program { static void Main(string[] args) { descargarFic("ftp://ftp.rediris.es/welcome.msg", "anonimous@nadie.com", "", @"E:\pruebas2"); Console.WriteLine("descargado"); Console.ReadLine(); } static void descargarFic(string ficFTP, string user, string pass, string dirLocal) { FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(ficFTP)); // Los datos del usuario (credenciales) NetworkCredential cr = new NetworkCredential(user, pass); dirFtp.Credentials = cr; // El comando a ejecutar usando la enumeración de WebRequestMethods.Ftp dirFtp.Method = WebRequestMethods.Ftp.DownloadFile; // Obtener el resultado del comando StreamReader reader = new StreamReader(dirFtp.GetResponse().GetResponseStream()); // Leer el stream string res = reader.ReadToEnd(); // Mostrarlo. //Console.WriteLine(res); // Guardarlo localmente con la extensión .txt string ficLocal = Path.Combine(dirLocal, Path.GetFileName(ficFTP) + ".txt"); StreamWriter sw = new StreamWriter(ficLocal, false, Encoding.UTF8); sw.Write(res); sw.Close(); // Cerrar el stream abierto. reader.Close(); } static void listarFTP(string dir, string user, string pass) { FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(dir)); // Los datos del usuario (credenciales) NetworkCredential cr = new NetworkCredential(user, pass); dirFtp.Credentials = cr; // El comando a ejecutar dirFtp.Method = "LIST"; // También usando la enumeración de WebRequestMethods.Ftp dirFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails; // Obtener el resultado del comando StreamReader reader = new StreamReader(dirFtp.GetResponse().GetResponseStream()); // Leer el stream string res = reader.ReadToEnd(); // Mostrarlo. Console.WriteLine(res); // Cerrar el stream abierto. reader.Close(); } } }
Nos vemos.
Guillermo
…
Hola,
es posible descargar una lista de ficheros por FTP pero utilizando para todos ellos el mismo login, es decir, que solo sea necesario validarse una unica vez.
Gracias de antemano por la ayuda.
Saludos
Hola,
Supongo que sÃ, pero no lo he probado… aunque en el código que muestro no es asÃ… asà que… tendrás que investigar un poco a ver… (es que yo no suelo usar este tipo de clases, y cuando lo he hecho es para pruebas y poco más :-()
Estoy buscando hace unos dias pero no encuentra nada, tendre que seguir en ello!
Muchas gracias
Como hago para indicarle que es solo un archivo el que quiero obtener?
O sea, pasarle el nombre, ejemplo: prueba.txt.
Gracias!
Liliana, el ejemplo ese es para descargar un solo fichero/archivo.
Hola,
existe la posibilidad de administrar la descarga del archivo o mostrar el progreso de dicha tranferencia?
Gracias.
Hola como hago para descargar todos los archivos que empiecen por un determinado nombre?
En mi carpeta del FTP tengo N archivos, pero sólo quiero descargar los que empiecen por una secuancia de letras que yo sé. Es posible? COmo lo puedo hacer?
Muchas gracias
Este sitio me ha sido de mucha ayuda, he encontrado de todo tipo de ejemplos…
gracias a el guille!!!!
Hola a tod@s!
Tengo (tenÃa) una aplicación pensada en enviar y recibir ficheros a traves de ftp, y tenÃa la montada de tal manera que podÃa navegar a traves de los directorios, etc. Ahora bien, nos han cambiado el protocolo a Secure ftp («SFTP») y no encuentro nada que sea freeware que me permita trabajar de la misma forma. Lo unico que he conseguido es preparar desde VB scripts para ejecutarlos con WinSCP a modo de proceso batch. Para salir del paso me sirve pero mi aplicación pierde el control del proceso (vamos, que si hay algún fallo no se entera). ¿Sabeis si existe algun componente, dll, activeX, lo que sea, que me permita hacer sftp desde VB?
Gracias
hola gente, estoy tratando de armar un ftp cliente con socket alguien tendra algun codigo fuente que me pueda orientar o este armado, de ser posible para visual basic 2008. desde ya gracias
Hola. estoy tratando de realizanr una conexion a un FTP por medio de un host usando su IP, usuario y contraseña. Soy algo nuevo en visual 2008, y mi pregunta es. Como hago que esta instruccion tome esos tres dato de unas cajas de texto? o y donde acomodarlo en tu codigo para que haga la conexion?
Hola Anthony, creo que asignando los datos del usuario y contraseña al objeto NetworkCredential deberÃa funcionar.
Muchas gracias, No hay una manera de declarar el FTP sin poner al principio «ftp://» lo que pasa es que cuando quiero entrar al servidor para descargar el archivo me dice que no existe. El archivo si existe y lo reviso al momento de entrar al FTP en el CMD y estoy pensando que puede ser que no entra por que le pongo «ftp://» y cuando entro por medio del CDM solo pongo la pura IP y entro bien. Ya intente ponerle al cmd «ftp:// seguido de la ip de mi servidor» y me dice unknow host.
Anthony, yo creo que no tienes que estar indicando lo de ftp:// en cada comando (o método) que indiques… pero si lo dices es que ya lo habrás probado… pero me extraña.
Si mira la verdad asi es como declaro mi ftp:
descargarFic(«123.122.12.3/monitor/revisa.txt», «aguser», «agpass», «C:\revisa»)
Pero me marca el error Invalid URI, yo se que eso me lo marca por que no pongo «ftp//» pero si lo pongo me mete a un host desconocido y el programa me marca que no exite el archivo o no hay acceso.
Disculpa la molestia. Si me pudieras decir como solucionarlo, te lo agradeceria.
Gracias.
Hola, La función para recorrer y recuperar el nombre de cada archivo dentro de un directorio FTP funcionaba bien ( utilizo Dim reader As New StreamReader(Respuesta.GetResponseStream()) ). Pero sin haber modificado mi aplicación, noté que en lugar de recibir el nombre de cada archivo(ejemplo xxxx.txt), empecé a recibir el nombre pero incluÃdo dentro de un XML <a href="xxxx.txt …….. Entiendo que algo de configuración deben haber cambiado lo cual hace que reciba el nombre de archivo como si fuera un link
No tengo ni idea…
¿Estás usando otra versión de Visual Studio (o del .NET)? a ver si va a ser algo de importaciones o de cambios en la funcionalidad de esas clases (cosa rara, pero…)
Buen dia.
Estoy usando el codigo para descargar unos archivos pero tengo un detalle, que condicion puedo usar cuando no encuentre el archivo se salga de la funcion y no me marque error y se espere al siguiente ciclo?
Gracias
Use un Try y funciono a la perfeccion. Aun asi Gracias por el codigo, Lo acomode para el programa que estoy usando.
Saludos
Buen Dia.
Tengo un problema para descargar archivos.
en la linea que dice:
Dim reader As New StreamReader(dirFtp.GetResponse().GetResponseStream())
Me marca error por que no existe el archivo que quiero descargar. Como puedo hacer que no me marque el error y se salga de la funcion hasta esperar al siguiente ciclo para volver a intentar descargar el archivo. Ya intente con un try pero no me funciona.
Gracias por la atencion
Hola,
como siempre digo, las consultas (aunque sea sobre código mostrado aquÃ) mejor en los foros públicos…
Ahora no recuerdo si lo hay, pero supongo que habrá forma de comprobar si ese archivo que quieres bajar está o no en el FTP (por ejemplo haciendo un «list»), por tanto… si ves que te da ese caso (de error) de que no está el archivo, comprueba si existe antes de intentar abrirlo/bajarlo.
Como hago para realizar lo contrario, en vez de bajar subir un archivo .txt
Saludos….
Hola, no tengo un ejemplo especÃfico creado (o al menos no lo recuerdo jeje), pero en este artÃculo tienes los comandos a usar para estas operaciones con FTP:
http://www.elguille.info/NET/dotnet/system_net_acceder_ftp.aspx