Librería FTP en C#

Librería FTP en C#

October 11, 2019

En las aplicaciones que utilizan FTP para intercambio de archivos, hasta ahora he utilizado un wrapper sobre la librería de FTP de.NET.

En uno de mis últimos proyectos, necesitaba acceder a FTPs y no pude conseguirlo a través de las librerías básicas de.NET. En algunos casos me daban errores de conexión a través de un proxy HTTP y en otros errores de comunicación. Existen formas de solventarlo pero me pareció más eficaz e instructivo implementarlo por mí mismo.

Así que armado con los conocimientos adquiridos en la programacación de mi servicio de SMTP para desarrollo y la información del protocolo FTP me puse manos a la obra. El resultado es una librería de acceso tanto a FTP como a FTPs o FTPes cuyo código fuente, como siempre, se puede encontrar en GitHub.

Nota: como base para la librería utilicé ArxOne.FTP que funciona bastante bien pero añade múltiples sesiones por conexión. Esto no supone ningún problema si realmente se necesitan utilizar varias sesiones, si no, complica bastante el código y nos obliga a utilizar bloqueos de acceso para poder trabajar con diferentes hilos.

Conexión a un servidor FTP

Para utilizar la librería, por supuesto lo primero es conectar al servidor. El código de conexión es bastante sencillo:

using Bau.Libraries.LibFtpClient;
using Bau.Libraries.LibFtpClient.Parameters;

//....

using (FtpClient objFtpClient = new FtpClient(FtpClient.FtpProtocol.FtpS, strServer, 
                                              intPort, new System.Net.NetworkCredential(strUser, strPassword), 
                                              new FtpClientParameters(blnPassive, FtpClientParameters(blnPassive, 
                                                                      FtpClientParameters.FtpProtection.FtpS, 
                                                                      FtpClientParameters.SslType.Default)))
{ 
	// Conecta al servidor
	objFtpClient.Connect();
	//..... aquí irían las funciones 
	// Desconecta del servidor
	objFtpClient.Disconnect();
}

El enumerado del modo (FtpClient.FtpProtocol) nos indica si deseamos conectar utilizando FTP, FTPs o FTPes. En los parámetros de la conexión indicamos si accedemos en modo pasivo y los métodos de protección y conexión por SSL.

Tratamiento de directorios

Una vez conectados, para obtener, crear, borrar o cambiar el directorio actual utilizamos los siguientes métodos:

string strActualPath = objFtpClient.Commands.GetActualPath();
objFtpClient.Commands.ChangeDir("/dev");
objFtpClient.Commands.MakeDir("/dev/test");
objFtpClient.Commands.MakeDirRecursive("/dev/hola/test/pruebas/");
objFtpClient.Commands.RemoveDirectory("/dev/hola/test/pruebas/");

Como podemos observar, en el manejo de directorios y archivos, se utiliza la barra de Unix en lugar de la barra invertida de Windows. En realidad, podemos utilizar cualquiera de las dos. La librería modifica el separador según la plataforma del servidor FTP.

Tratamiento de archivos

Por supuesto, además de con directorios podemos tratar con archivos. Tenemos funciones para borrar un archivo o cambiarle el nombre:

objFtpClient.Commands.Delete(strFileRemote);
objFtpClient.Commands.Rename(strFileRemoteOld, strFileRemoteNew);

Si deseamos ver el listado de archivos del directorio actual utilizamos una función como la siguiente:

IList<FtpEntry> objColFiles = objFtpClient.Commands.List(cnstStrPathRemote)
foreach (FtpEntry objFile in objColFiles)
	Console.WriteLine("{0} - {1} - {2} - {3}", 
                      objFile.Name, objFile.Type == FtpEntry.FtpEntryType.Directory? "Directorio": "Archivo",
                      objFile.Size, objFile.Date);

El método List utiliza el comando LIST de FTP para obtener los archivos. En algunos servidores se puede utilizar también el comando MLST que en teoría ofrece más información. Para ello podemos utilizar el método:

IList<FtpEntry> objColFiles = objFtpClient.Commands.MList(cnstStrPathRemote)

Subida y descarga de archivos al servidor FTP

Por supuesto, lo más importante de una librería de FTP es que nos permita subir y descargar archivos. Los métodos para ésto son los siguientes:

objFtpClient.Commands.Upload(strFileLocal, strFileRemote);
objFtpClient.Commands.Download(strFileRemote, strFileLocal);

Código fuente

Como comentábamos al principio, podemos encontrar el código fuente de la librería cliente de FTP en GitHub.

Aparte del código de la librería (proyecto LibFtpClient) en la solución se incluye el proyecto de consola TestLibFtp que muestra los parámetros de conexión y cómo utilizar los diferentes comandos y modos de conexión.

Por cierto, la librería no trata con el protocolo sFTP que aunque pueda parecer lo mismo que FTPs, en realidad es un protocolo completamente diferente. Si necesitan una librería de sFTP les propongo SSH.Net.