Descargar archivos de un FTP

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

Esta entrada fue publicada en cosas técnicas, mis cosas y etiquetada , , , . Guarda el enlace permanente.

23 respuestas a Descargar archivos de un FTP

  1. blanca dijo:

    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

  2. elGuille dijo:

    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 :-()

  3. blanca dijo:

    Estoy buscando hace unos dias pero no encuentra nada, tendre que seguir en ello!

    Muchas gracias

  4. Liliana dijo:

    Como hago para indicarle que es solo un archivo el que quiero obtener?
    O sea, pasarle el nombre, ejemplo: prueba.txt.

    Gracias!

  5. elGuille dijo:

    Liliana, el ejemplo ese es para descargar un solo fichero/archivo.

  6. jonathan dijo:

    Hola,
    existe la posibilidad de administrar la descarga del archivo o mostrar el progreso de dicha tranferencia?

    Gracias.

  7. Manel dijo:

    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

  8. Octavio Osorio dijo:

    Este sitio me ha sido de mucha ayuda, he encontrado de todo tipo de ejemplos…

    gracias a el guille!!!!

  9. Alex Olmo dijo:

    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

  10. Emanuel dijo:

    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

  11. Anthony dijo:

    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?

  12. elGuille dijo:

    Hola Anthony, creo que asignando los datos del usuario y contraseña al objeto NetworkCredential debería funcionar.

  13. Anthony dijo:

    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.

  14. elGuille dijo:

    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.

  15. Anthony dijo:

    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.

  16. Daniel dijo:

    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

    • elGuille dijo:

      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…)

  17. Anthony dijo:

    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

    • Anthony dijo:

      Use un Try y funciono a la perfeccion. Aun asi Gracias por el codigo, Lo acomode para el programa que estoy usando.

      Saludos

  18. Anthony dijo:

    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

    • elGuille dijo:

      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.

  19. ALUCARD dijo:

    Como hago para realizar lo contrario, en vez de bajar subir un archivo .txt
    Saludos….

Los comentarios están cerrados.