ComponentPro UltimateFtp

Download remote files simultaneously

Language Filter: AllSend comments on this topic to ComponentPro

Downloading files and directories from the remote FTP server to the local disk is quite simple. All that needs to occur is passing appropriate server information such as hostname, port, username, password/private key and the number of threads to the Download method of the Ftp class.

The following steps illustrate how to use the Download to download files and directories.

using System;
using System.Threading;
using ComponentPro.IO;
using ComponentPro.Net;

...

static void Main()
{
    // Create a new class instance. 
    Ftp client = new Ftp();

    // Connect to the server. 
    client.Connect("server");

    // Authenticate. 
    client.Authenticate("user", "pass");

    client.CommandResponse += client_ResponseRead;

    // You can register the ThreadStateChanged event here or in the client_Progress event handler as shown below. 
    client.ThreadStateChanged += Thread_StateChanged;
    client.Progress += client_Progress;

    // ... 
 
    // Download files and subdirectories from "/my folder" to "c:\\my folder" using 3 threads. This waits untils these threads complete. 
    client.Download("/my folder", "c:\\my folder", 3, true);

    // ... 
 
    client.Disconnect();
}

static void client_Progress(object sender, FileSystemProgressEventArgs e)
{
    // You can access the threads used for the multi-thread file operation here. 
    // Uncomment the following code to register the StateChanged event of each thread. 
    //if (e.State == TransferState.DirectoryStructureBuilt) 
    //{ 
    //    for (int i = 0; i < e.TransferStatistics.Threads.Count; i++) 
    //    { 
    //        e.TransferStatistics.Threads[i].StateChanged += Thread_StateChanged; 
    //    } 
    //} 
 
    // When the multi-thread operation completes the status is MultiFileOperationCompleted. 
    if (e.State == TransferState.MultiFileOperationCompleted)
        Console.WriteLine("File transfer completed");
}

static long _threadsCompleted;
static void Thread_StateChanged(object sender, TransferThreadStateChangedEventArgs e)
{
    if (e.State == TransferThreadState.Stopped) // The thread is stopped 
    {
        TransferThreadInfo info = (TransferThreadInfo)sender;

        Console.WriteLine(string.Format("Thread ID {0} completed", info.ThreadId));

        Interlocked.Increment(ref _threadsCompleted);
        if (Interlocked.Read(ref _threadsCompleted) == 3)
        {
            Console.WriteLine("Multi-threads file transfer completed");
        }
    }
}

static void client_ResponseRead(object sender, CommandResponseEventArgs e)
{
    Ftp client = (Ftp)sender;

    if (client.ThreadId >= 0)
        if (e.Command != null)
            Console.WriteLine("Thread: {0} - CMD>       {1}", client.ThreadId,
                e.Command);
        else 
            Console.WriteLine("Thread: {0} - RESPONSE>  {1}", client.ThreadId,
                e.Response);
}