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.