C# la gestione FTP con il .Net 6

Articolo introduttivo alle classi per la gestione del trasferimento dei file tramite FTP.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come utilizzare le classi per la gestione di scenari di tipo FTP, con il linguaggio di programmazione C# tramite la versione del Framework .Net 6 e l’ambiente di sviluppo Visual Studio 2022 Community.
Le classi FTP permettono il trasferimento dei file ed altre operazioni su spazi web, gestione di altri server.
Supponiamo di avere un nostro sito, e vogliamo caricare o scaricare dei file oppure leggere il contenuto di una determinata cartella del nostro sito web, tramite la classi FTP del Framework possiamo gestire questo scenario.
L’articolo vuole fornire al lettore la conoscenza base di queste classi, con alcune semplici operazioni, come la lettura dei file presenti nello spazio web, il download di un determinato file ed effettuare il caricamento di un determinato file, comunemente detto upload.

Creazione del progetto

Apriamo Visual Studio 2022 Community o versione successiva e si crea un nuovo progetto di tipo “App Windows Application”, facciamo click sul pulsante “Avanti” assegniamo un nome al progetto e tramite il pulsante “avanti”, selezioniamo la versione del Framework 6, che è l’ultima versione nel momento in cui stiamo scrivendo l'articolo.
Nella form, aggiungiamo tre pulsanti, con il quale ogni pulsante eseguirà una determinata operazione. Il primo pulsante permetterà di leggere il contenuto del server FTP, tutti i nomi del file presente nel percorso che indicheremo.
Un pulsante denominato “Download” per il download dei file, ed infine un pulsante per il caricamento dei file, denominato “upload” il tutto come mostrato in figura 1.

finestra con 3 pulsanti C#

Figura 1 – La finestra con i tre pulsanti

Stesura del codice

Terminata la creazione del progetto e la progettazione della form, non resta che scrivere il codice per i pulsanti.
Passiamo in visualizzazione codice, e sopra ad ogni dichiarazione, aggiungiamo lo spazio dei nomi per la gestione dei scenari di tipo FTP.
Lo spazio .Net contiene tutte le classi per la gestione del web, qui di seguito la dichiarazione di tale spazio web.

C#
using System.Net;

Ritorniamo in visualizzazione grafica e facciamo doppio sul pulsante con il testo “Leggi” in modo da passare in visualizzazione codice nell’evento click del pulsante.

Il codice illustra una tecnica di come leggere i file presenti nel sito web (spazio web) di un determinato sito ospitato in altervista.
Tramite la classe “FtpWebrequest” si ottiene un oggetto per accedere al sito e tramite il metodo GetResponse, otteniamo la lista di tutti i file presenti nello spazio web.
Impostando la proprietà “Method” su ListDirectory, ci fornisce le informazioni presenti nello spazio web, in quanto impostiamo di fornire la lista della directory.
Tramite il metodo GetResponseStream, viene creato un oggetto di tipo StreamReader, con il quale abbiamo le informazioni che possiamo visualizzare a video tramite messagebox relativo ai nomi dei file.
Qui di seguito il frammento di codice delle suddette operazioni.

C#
private void BtnFTP_Click(object sender, EventArgs e)
{
string Sito = "ftp://nomesito.altervista.org";
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(Sito);
ftpRequest.Credentials = new NetworkCredential("UserName", "Password");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
using (FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
{
string Nomefile= streamReader.ReadLine();
while (!string.IsNullOrEmpty(Nomefile))
{
MessageBox.Show(Nomefile);
Nomefile= streamReader.ReadLine();
}
}
}
}

Ritorniamo in visualizza grafica e facciamo doppio click sul pulsante denominato “Download”, in modo di passare nell’evento click del pulsante, e scrivere il codice per scaricare un determinato file.
In questo caso la proprietà Method viene impostato su “DownloadFile” in modo che l’oggetto di tipo FtpWebRequest, esegue operazione di download.
Una volta ottenuto lo stream dei dati del file da scaricare, si crea nel proprio pc il file.
Qui di seguito il frammento di codice delle suddette operazioni per l’evento click del pulsante Download.

C#
private void BtnFtpDownload_Click(object sender, EventArgs e)
{
string Sito = "ftp://NomeSito.altervista.org/home.gif";
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(Sito);
ftpRequest.Credentials = new NetworkCredential("UserName", "Password");
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
using (FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
FileStream fileStream = new FileStream("C:\\Varie\\DownloadHome.gif", FileMode.Create);
byte[] buffer = new byte[2048];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
while (bytesRead > 0)
{
fileStream.Write(buffer, 0, bytesRead);
bytesRead = stream.Read(buffer, 0, buffer.Length);
}
}
MessageBox.Show(response.StatusDescription);
}
}

Passiamo in modalità grafica per scrivere il codice dell’ultimo pulsante, quello relativo al caricamento dei file nel server, la funzione di upload.
In questo caso possiamo intervenire in due modalità, o tramite la classe webclient oppure con la classe FTPWebRequest, che abbiamo visto nei precedenti esempi.
Vedremo entrambi i scenari per fornire al lettore le varie possibilità messe a disposizione dalle classi del Framework.
Facciamo doppio sul pulsante con la dicitura “Upload” in modo che passiamo in visualizzazione codice.
In questo primo esempio vedremo come utilizzare la classe webclient per il caricamento dei file.

C#
private void BtnFtpUpload_Click(object sender, EventArgs e)
{
using (WebClient client = new WebClient())
{
client.Credentials = new NetworkCredential("UserName", "Password");
client.UploadFile("ftp://Sito.altervista.org/NomeFile.jpg", WebRequestMethods.Ftp.UploadFile, "C:\\Varie\\NomeFile.jpg");
}
}

Come si è visto dal precedente codice, dopo aver impostato le credenziali, tramite il metodo “UploadFile, dell’oggetto WebClient, passiamo i parametri, quali, sito e nome del file dove caricare il file, la modalità di operazione, in questo caso “UploadFile” ed infine il file sul pc locale che vogliamo caricare sul server.
Un’altra tecnica è quella tramite le classi per la gestione FTP.
Tramite la classe FtpRequest, impostando la proprietà “Credentials” con i dati di accesso e la proprietà “Method” con il valore Upload, viene effettuata l’operazione di caricamento dei file.
Dopo aver rilevare lo stream dei dati dal file locale, lo si imposta all’oggetto di tipo Stream, con il quale possiamo caricare il file sul server nel momento in cui viene eseguito il metodo “GetResponse”.
Qui di seguito il frammento di codice delle suddette operazioni per effettuare il caricamento dei file sul server.

C#
private void BtnFtpUpload_Click(object sender, EventArgs e)
{
string Sito = "ftp://Sito.altervista.org/upload.jpg";
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(Sito);
ftpRequest.Credentials = new NetworkCredential("UserName", "Password");
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
byte[] dataFileUpload = File.ReadAllBytes("C:\\Varie\\upload.jpg");
ftpRequest.ContentLength = dataFileUpload.Length;
using (Stream stream = ftpRequest.GetRequestStream())
{
stream.Write(dataFileUpload, 0, dataFileUpload.Length);
stream.Close();
FtpWebResponse risultatoUpload = (FtpWebResponse)ftpRequest.GetResponse();
MessageBox.Show(risultatoUpload.StatusDescription);
}
}

Conclusioni

L’articolo ha voluto fornire alcuni aspetti basilari nonché una breve introduzione alla programmazione FTP tramite il linguaggio di programmazione C# con l’ultima versione del Framework al momento disponibile. Il lettore può approfondire il tema, anche realizzando un proprio applicativo di tipo FTP per gestire i file del proprio sito. La tecnologia .Net come si è visto in questo articolo, tramite le numerose classi, mette a disposizione del programmatore strumenti che facilitano la scrittura del codice nonché la realizzazione di applicazioni, anche di una certa complessità.