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

23 comentarios en “Descargar archivos de un FTP

  1. blanca

    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

    Responder
  2. elGuille Autor

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

    Responder
  3. Liliana

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

    Gracias!

    Responder
  4. Manel

    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

    Responder
  5. Alex Olmo

    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

    Responder
  6. Emanuel

    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

    Responder
  7. Anthony

    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?

    Responder
  8. Anthony

    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.

    Responder
  9. elGuille

    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.

    Responder
  10. Anthony

    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.

    Responder
  11. Daniel

    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

    Responder
    1. elGuille Autor

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

      Responder
  12. Anthony

    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

    Responder
  13. Anthony

    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

    Responder
    1. elGuille

      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.

      Responder

Responder a Anthony Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *