13 de julio de 2011

Cliente ftp con CSharp

//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;
}

}

4 comentarios: