csharp-fluentftp

Cómo usar FTP desde C# con FTP Fluent

FluentFTP es una biblioteca de código abierto para .NET que nos permite interactuar con servidores FTP de manera fácil y eficiente desde una aplicación en C#.

La librería se basa en el protocolo FTP (File Transfer Protocol), que es un estándar de la industria para el intercambio de archivos en la red, aunque también soporta también admite FTPS (no con SFTP).

FluentFTP admite una amplia variedad de operaciones comunes como subir y descargar archivos, crear y eliminar directorios, verificación de hash, entre otras muchas. En general, tiene cualquier operación que podías necesitar en materia de FTP.

Además cuenta con un montón de opciones que podemos usar para personalizar su comportamiento a las necesidades de nuestro proyecto. Finalmente, también dispone de un sistema de control de errores integrado que nos ayuda a gestionar los posibles errores durante la comunicación.

Cómo usar FluentFTP

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package FluentFTP

Aquí tenéis algunos de cómo utilizar FluentFTP extraídos de la documentación de la librería. Por ejemplo, una conexión básica a un servidor y obtener la información de un fichero.

// create an FTP client and specify the host, username and password
var client = new FtpClient("123.123.123.123", "username", "pasword");

// connect to the server and automatically detect working FTP settings
client.AutoConnect();

// get a list of files and directories in the "/htdocs" folder
foreach (FtpListItem item in client.GetListing("/htdocs"))
{
	// if this is a file
	if (item.Type == FtpObjectType.File) {

		// get the file size
		long size = client.GetFileSize(item.FullName);

		// calculate a hash for the file on the server side (default algorithm)
		FtpHash hash = client.GetChecksum(item.FullName);
	}

	// get modified date/time of the file or folder
	DateTime time = client.GetModifiedTime(item.FullName);
}

client.Disconnect();

Aquí tenéis un recopilatorio con algunas de las acciones habituales que podemos realizar ocn FluentFTP

// check if a file exists
if (client.FileExists("/htdocs/big2.txt")) { }

// check if a folder exists
if (client.DirectoryExists("/htdocs/extras/")) { }

// compare the downloaded file with the server
if (client.CompareFile(@"C:\MyVideo_2.mp4", "/htdocs/MyVideo_2.mp4") == FtpCompareResult.Equal) { }

// move the uploaded file
client.MoveFile("/htdocs/MyVideo.mp4", "/htdocs/MyVideo_2.mp4");

// download the file again
client.DownloadFile(@"C:\MyVideo_2.mp4", "/htdocs/MyVideo_2.mp4");

// download a folder and all its files
client.DownloadDirectory(@"C:\website\logs\", @"/public_html/logs", FtpFolderSyncMode.Update);

// download a folder and all its files, and delete extra files on disk
client.DownloadDirectory(@"C:\website\dailybackup\", @"/public_html/", FtpFolderSyncMode.Mirror);

// upload a file
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/MyVideo.mp4");

// upload a file and retry 3 times before giving up
client.Config.RetryAttempts = 3;
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt", FtpRemoteExists.Overwrite, false, FtpVerify.Retry);

// upload a folder and all its files
client.UploadDirectory(@"C:\website\videos\", @"/public_html/videos", FtpFolderSyncMode.Update);

// upload a folder and all its files, and delete extra files on the server
client.UploadDirectory(@"C:\website\assets\", @"/public_html/assets", FtpFolderSyncMode.Mirror);

// delete the file
client.DeleteFile("/htdocs/MyVideo_2.mp4");

// delete a folder recursively
client.DeleteDirectory("/htdocs/extras/");