//Aqui les dejo una clase completa para el manejo de archivos por FTP con CSharp
//Framework 2.0
//
using Microsoft.CSharp;
using System.Net;
using System.IO;
using System.Threading;
using System.Configuration;
using System;
public class FTP
{
    public string host, user, pass;
    public FTP(string host,string user,string pass)
	{
        this.host = host;
        this.user = user;
        this.pass = pass;
       
	}
   
   
    public string eliminarFichero(string fichero)
    {
        FtpWebRequest peticionFTP;
          // Creamos una petición FTP con la dirección del fichero a eliminar
        peticionFTP = (FtpWebRequest)WebRequest.Create(new System.Uri(fichero));
             // Fijamos el usuario y la contraseña de la petición
      
       peticionFTP.Credentials = new NetworkCredential (user,pass);
       //      ' Seleccionamos el comando que vamos a utilizar: Eliminar un fichero
           peticionFTP.Method = WebRequestMethods.Ftp.DeleteFile;
           peticionFTP.UsePassive = false;
           try
           {
                
              FtpWebResponse  respuestaFTP;
              respuestaFTP = (FtpWebResponse)peticionFTP.GetResponse();
              respuestaFTP.Close();
              return string.Empty;
            }
        catch (Exception ex)
           {
               return ex.Message;  
            }  
      }
    public Boolean existeObjeto(ref String dir)
    {
        FtpWebRequest peticionFTP;
        //Creamos una peticion FTP con la dirección del objeto que queremos saber si existe
        peticionFTP = (FtpWebRequest)WebRequest.Create(new Uri(dir));
        //Fijamos el usuario y la contraseña de la petición
        peticionFTP.Credentials = new NetworkCredential(user, pass);
        //Para saber si el objeto existe, solicitamos la fecha de creación del mismo
        peticionFTP.Method =WebRequestMethods.Ftp.GetDateTimestamp ;
        peticionFTP.UsePassive =false;
        peticionFTP.KeepAlive = true;
        try
        {
            //si el objeto existe, se devolvera true
            FtpWebResponse  respuestaFTP;
            //respuestaFTP = CType(peticionFTP.GetResponse(), FtpWebResponse)
            respuestaFTP = (FtpWebResponse)peticionFTP.GetResponse();
           
            return true;
        }
        catch (Exception ex)
        {
            //si el objeto no existe, se producirá un error y al entrar por el Catch
            //se devolvera falso
            return false;
        }
       
    }
      public String creaDirectorio(String dir)
      {
     
              FtpWebRequest peticionFTP;
            // Creamos una peticion FTP con la dirección del directorio que queremos crear
            peticionFTP =  (FtpWebRequest) WebRequest.Create(new Uri(dir));
            peticionFTP.KeepAlive = true;
            // Fijamos el usuario y la contraseña de la petición
            peticionFTP.Credentials = new NetworkCredential(user, pass);
            // Seleccionamos el comando que vamos a utilizar: Crear un directorio
            peticionFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
            //(FtpWebResponse) request.GetResponse();
            try
            {
                FtpWebResponse  respuesta;
                respuesta = (FtpWebResponse) peticionFTP.GetResponse();
                respuesta.Close();
                // Si todo ha ido bien, se devolverá String.Empty
                return string.Empty;
                 
            }
            catch  (Exception ex)
            { 
                // Si se produce algún fallo, se devolverá el mensaje del error
                return ex.Message;
            }
          
        }
   
      public  String subirFichero(String fichero,   String destino,  String dir )          
      {
     
            FileInfo  infoFichero = new FileInfo(fichero);
            String  uri;
            uri = destino;
            // Si no existe el directorio, lo creamos
           String  str="";
           if (!existeObjeto(ref dir)) str = creaDirectorio(dir);
           FtpWebRequest peticionFTP;
            // Creamos una peticion FTP con la dirección del fichero que vamos a subir
            peticionFTP =   (FtpWebRequest) FtpWebRequest.Create(new  Uri(destino));
            // Fijamos el usuario y la contraseña de la petición
            peticionFTP.Credentials = new NetworkCredential(user, pass);
            peticionFTP.KeepAlive = false;
            peticionFTP.UsePassive = false;
            // Seleccionamos el comando que vamos a utilizar: Subir un fichero
            peticionFTP.Method = WebRequestMethods.Ftp.UploadFile;
            // Especificamos el tipo de transferencia de datos
            peticionFTP.UseBinary = true;
            // Informamos al servidor sobre el tamaño del fichero que vamos a subir
            try
            {
                peticionFTP.ContentLength = infoFichero.Length;
            }
               
            catch   (Exception ex)
            {return ex.Message;}
            // Fijamos un buffer de 2KB
            int longitudBuffer;
            longitudBuffer = 2048;
            Byte[] lector = new Byte[2048] ; // esti estaba Byte (2048);
            int num;
            // Abrimos el fichero para subirlo
            FileStream fs;
            fs = infoFichero.OpenRead();
            Stream  escritor = null;
            try
            {  escritor = peticionFTP.GetRequestStream();
              // Leemos 2 KB del fichero en cada iteración
                num = fs.Read(lector, 0, longitudBuffer);
               // num=fs.Read (lector[],0,longitudBuffer);
                while (num != 0)
                {
                    // Escribimos el contenido del flujo de lectura en el
                    // flujo de escritura del comando FTP
                    escritor.Write(lector, 0, num);
                    num = fs.Read(lector, 0, longitudBuffer);
                }
                escritor.Close();
                fs.Close();
                //Si todo ha ido bien, se devolverá String.Empty
                return String.Empty;
            }
            catch  (WebException ex){
                if  (escritor == null )  escritor.Close();
                fs.Close();
                // Si se produce algún fallo, se devolverá el mensaje del error
                return ex.Message;
            }
          
       
      }
       public String subirFicheroSeguimiento(String  fichero,  String destino ,  String  dir )
       {
            FileInfo  infoFichero = new FileInfo(fichero);
            String  uri;
            uri = destino;
            // Si no existe el directorio, lo creamos
            if (!existeObjeto(ref dir)) {}
                // Dim str As String = creaDirectorio(dir)
           
           FtpWebRequest  peticionFTP;
            // Creamos una peticion FTP con la dirección del fichero que vamos a subir
            peticionFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(destino));
            // Fijamos el usuario y la contraseña de la petición
            peticionFTP.Credentials = new NetworkCredential(user, pass);
            peticionFTP.KeepAlive = false;
            peticionFTP.UsePassive = false;
            // Seleccionamos el comando que vamos a utilizar: Subir un fichero
            peticionFTP.Method = WebRequestMethods.Ftp.UploadFile;
            // Especificamos el tipo de transferencia de datos
            peticionFTP.UseBinary = true;
            // Informamos al servidor sobre el tamaño del fichero que vamos a subir
            try
            {
                peticionFTP.ContentLength = infoFichero.Length;
            }
              
            catch   ( Exception  ex)
                {
                return ex.Message;
                }
            // Fijamos un buffer de 2KB
            int longitudBuffer;
            longitudBuffer = 2048;
            byte[] lector = new Byte[2048];
            int num;
            // Abrimos el fichero para subirlo
              FileStream fs;
            fs = infoFichero.OpenRead();
             Stream escritor  = null;
            try
            {
                escritor = peticionFTP.GetRequestStream();
                // Leemos 2 KB del fichero en cada iteración
                num = fs.Read(lector, 0, longitudBuffer);
                while (num != 0)
                {
                    // Escribimos el contenido del flujo de lectura en el
                    // flujo de escritura del comando FTP
                    escritor.Write(lector, 0, num);
                    num = fs.Read(lector, 0, longitudBuffer);
              }
                escritor.Close();
                fs.Close();
                // Si todo ha ido bien, se devolverá String.Empty
                return String.Empty;
            }
            catch  (WebException ex)
            {
                if (!(escritor==null))  escritor.Close();
                fs.Close();
                // Si se produce algún fallo, se devolverá el mensaje del error
                return ex.Message;
            }
          
      }
       public void descargarDirectorio(string dirD)
       {
           FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(host));
           // 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.ListDirectory;
           // Obtener el resultado del comando
           StreamReader reader =
               new StreamReader(dirFtp.GetResponse().GetResponseStream());
           // Leer el stream
           string res = "";//reader.ReadLine();
           //Response.Write(res);
           string nuevo_dir = "";
           while (!reader.EndOfStream)
           {
               res = reader.ReadLine();
               if (res.Contains("."))
               {
                   //Response.Write(res + "
");
                   bajaArchivo(host, dirD, res);
               }
               else
               {
                   //Response.Write(res + "
");
                   nuevo_dir = dirD + res;
                   Directory.CreateDirectory(nuevo_dir);
                   listarDirRecursivo(host + res + "/", nuevo_dir + "\\", user, pass);
               }
           }
           reader.Close();
  
       }
       private void listarDirRecursivo(string dirO, string dirD, string user, string pass)
       {
           FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(dirO));
           // 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.ListDirectory;
           // Obtener el resultado del comando
           StreamReader reader = new StreamReader(dirFtp.GetResponse().GetResponseStream());
           // Leer el stream
           string res = "";//reader.ReadLine();
           //Response.Write(res);
           string nuevo_dir = "";
           while (!reader.EndOfStream)
           {
               res = reader.ReadLine();
               if (res.Contains("."))
               {
                   //Response.Write(res + "
");
                   bajaArchivo(dirO, dirD, res);
               }
               else
               {
                   //Response.Write(res + "
");
                   nuevo_dir = dirD + res;
                   Directory.CreateDirectory(nuevo_dir);
                   listarDirRecursivo(dirO + res + "/", nuevo_dir + "\\", user, pass);
               }
               //   res = reader.ReadLine();
               // Response.Write(res + "
");
           }
           reader.Close();
           // Mostrarlo.
           //Console.WriteLine(res);
           // Cerrar el stream abierto.
       }
       private void bajaArchivo(string dirO, string dirD, string archivo)
       {
           using (WebClient wc = new WebClient())
           {
               wc.Proxy = null;
               wc.BaseAddress = dirO;
               // Authenticate, then download a file to the FTP server.
               // The same approach also works for HTTP and HTTPS.
               string username = user;
               string password = pass;
               wc.Credentials = new NetworkCredential(username, password);
               wc.DownloadFile(archivo, dirD + archivo);
           }
       }
       public void bajaArchivoP(string dirO, string dirD, string archivo)
       {
           using (WebClient wc = new WebClient())
           {
               wc.Proxy = null;
               wc.BaseAddress = dirO;
               // Authenticate, then download a file to the FTP server.
               // The same approach also works for HTTP and HTTPS.
               string username = user;
               string password = pass;
               wc.Credentials = new NetworkCredential(username, password);
               wc.DownloadFile(archivo, dirD);
           }
       }
       public void subirArchivo(string rutaOrigen, string rutaDestino)
       {
           using (WebClient wc = new WebClient())
           {
               wc.Proxy = null;
              
               // Authenticate, then download a file to the FTP server.
               // The same approach also works for HTTP and HTTPS.
               string username = user;
               string password = pass;
               wc.Credentials = new NetworkCredential(username, password);
               wc.UploadFile(rutaDestino, rutaOrigen);
           }
       }
       public Boolean verificaExitencia(string nombreObjeto)
       {
           FtpWebRequest dirFtp = ((FtpWebRequest)FtpWebRequest.Create(host));
           Boolean respuesta = false;
           // 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.ListDirectory;
           // Obtener el resultado del comando
           StreamReader reader =
               new StreamReader(dirFtp.GetResponse().GetResponseStream());
           // Leer el stream
           string res = "";//reader.ReadLine();
           //Response.Write(res);
     
           while (!reader.EndOfStream)
           {
               res = reader.ReadLine();
               if (res == nombreObjeto)
               {
                   respuesta= true;
               }
 
           }
           reader.Close();
           return respuesta;
       }
}