WINSCP per FTP
Introduzione
In questo nuovo articolo vedremo un controllo di terze parti per facilitare il caricamento delle cartelle su un server FTP.
A molti di noi sarà capitato sicuramente la necessità di inviare non un file in un server FTP ma di una intera cartella, comprese di cartelle, sottocartelle e vari file.
Abbiamo, nel .NET Framework una bella classe in System.Net chiamata FtpWebRequest.
Per la maggior parte dei casi questo è sufficiente, ma ci sono anche casi che dovete trasferire una intera cartella.
I limiti della classe sopra menzionata è che dovete aspettare che il comando venga eseguito prima di poter dare avvio all’upload del successivo file.
In pratica funziona così:
1) Creazione della cartella nel server FTP
2) Enumerare la cartella locale
3) Per ogni file fare un ciclo For Each e caricare un file alla volta
4) Per ogni sottocartella rifare i passaggi dall’1.
Vedete quindi che la situazione diventa macchinosa. Dalle prove ed esperimenti fatti la cartella trasferita ha qualche file in meno o è mancante qualche cartella oppure si pianta.
Così, cercando per il Web ho trovato la libreria SCP per FTP.
Il sito di riferimento è http://winscp.net/eng/docs/lang:it
Cosa è WINSCP?
Come dice lo stesso sito, WinSCP è un client grafico open source per Windows per SFTP e FTP. Supporta inoltre il protocollo legacy SCP. La sua funzione principale è quella di copiare in modo sicuro file tra un computer locale e uno remoto.
Possiamo quindi anche rinominare le cartelle, I file, cancellarli e creare nuove cartelle e file senza difficoltà.
Funzionamento
Prima di tutto dovremo scaricare e installare l’installer. Questo farà si che saranno copiati I necessari file all’interno di Windows e registrate nel registro di Windows.
Il Setup lo potete scaricare da questo link: http://winscp.net/eng/download.php
Tra le opzioni di download abbiamo:
1) Pacchetto di installazione (installazione delle librerie e del programma di esempio)
2) Esecuzione portatile (esegue il programma di esempio)
3) .NET Assembly (contiene il file eseguibile di esempio più la libreria)
4) Codice Sorgente (il progetto è Open Source e c’è anche una versione per .NET)
Prima di tutto eseguiamo il Setup per installare e registrare le librerie. L’installazione è semplice e non verrà presa in considerazione. Al termine dell’installazione potete provare a giocare col programma di esempio per vedere le funzionalità.
Concentriamoci quindi adesso su come utilizzarla.
Creiamo un nuovo progetto WPF in Visual Studio 2015 e lo chiamiamo WinScf. Ovviamente in Visual Basic, perché è il mio linguaggio preferito con il quale mi sento più a mio agio.
Come prima cosa importiamo la libreria. Copiamo prima la DLL scaricata nel punto 3) nella cartella del nostro progetto (in base anche a come organizzate il lavoro) e quindi aggiungiamo la Reference.
Creiamo ora una cartella in c:\ chiamata FTP contenente file e sottocartelle da trasferire nel nostro server ftp, come ad esempio nella seguente figura.
Come potete vedere andremo a caricare 15 file e 1 cartella.
A questo punto siamo pronti per scrivere il codice.
Mettiamo nella Window un pulsante che darà il via al trasferimento di quanto contenuto in C:\FTP e 3 TextBox con altrettanti TextBlock per poter scrivere il nome del server, username e password.
Diamo per scontato che la porta sia la 21, quella di default dell’FTP.
Lo XAML sarà simile al seguente:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WinScf"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="SERVER FTP" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" />
<TextBlock Text="USERNAME" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" />
<TextBlock Text="PASSWORD" Grid.Column="0" Grid.Row="2" VerticalAlignment="Center" />
<TextBox Name="ServerTextBox" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" />
<TextBox Name="UsernameTextBox" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" />
<TextBox Name="PasswordTextBox" Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" />
<Button Name="AvvuaTrasferimentoButton" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" Width="200" Margin="5" Content="AVVIA TRASFERIMENTO FTP"/>
</Grid>
</Window>
Mentre il Code Behind sarà:
Imports WinSCP
Class MainWindow
Private Sub AvvuaTrasferimentoButton_Click(sender As Object, e As RoutedEventArgs) Handles AvvuaTrasferimentoButton.Click
Try
Dim mySessionOptions As New SessionOptions
With mySessionOptions
.Protocol = Protocol.Ftp
.HostName = ServerTextBox.Text
.UserName = UsernameTextBox.Text
.Password = PasswordTextBox.Password
.PortNumber = 21
.Protocol = Protocol.Ftp
.FtpMode = FtpMode.Active
.FtpSecure = FtpSecure.None
End With
Using mySession As Session = New Session
' Connect
mySession.Open(mySessionOptions)
' Upload files
mySession.PutFiles("C:\FTP\", "/" & "/htdocs/").Check()
End Using
MessageBox.Show("Trasferimento completato con successo.")
Catch ex As Exception
MessageBox.Show("Attenzione, si è verificato un errore durante l'upload.")
End Try
End Sub
End Class
Lanciamo l’applicazione e nel mio caso dopo circa 25 secondi mi sarà mostrata la finestra che i file sono stati trasferiti con successo.
Ed ecco i file nell’FTP:
Una piccola annotazione a margine. Notare che ho scritto ftp.crystalweb.it , senza ftp://. Ricordatevi di questo, altrimenti darà un‘eccezione.
Con il messaggio:
Senza indicare che è stato inserito “ftp://”
Chiaro che poi si potrebbe migliorare l’applicazione mettendo ad esempio una schermata di Attesa nel frattempo che fa l’upolad e molto altro ancora.
Notate infine che possiamo anche fare upload su server FTP sicuri impostando il parametro .FtpSecure su implicito od esplicito a seconda del caso, possiamo fare il login anche in modalità passiva impostando .FtpMode = FtpMode.Passive, ompostare una password sicura agendo sul parametro .SecurePassword e altro ancora.
Conclusioni
Abbiamo visto in questo articolo un’alternativa al FtpWebRequest contenuto in System.Net per il trasferimento di file e cartelle in un server FTP.
Alternativa valida, efficiente e veloce da implementare.