Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to transfer multiple files from FTP server to local directory using C#?

I can transfer one file from ftp server to local directory. using the following code

  using (WebClient ftpClient = new WebClient())
        {
            ftpClient.Credentials = new System.Net.NetworkCredential("username", "password");
            ftpClient.DownloadFile("ftp://website.com/abcd.docx", @"D:\\WestHam\test.docx");

but i don't know how to transfer multiple files. can anybody help me on this. }

like image 292
Anjali Avatar asked Dec 11 '13 17:12

Anjali


People also ask

How do I transfer files from FTP to local directory?

Alternatively, type FTP and press Enter at the command prompt in Windows. From here, use the open command to connect to the server. Once you login, it takes you to the default directory. You can move to the one where you want to copy files to, and open it using the command.

How do I copy multiple files from an FTP site?

To copy multiple files at once, use the mget command. You can supply a series of individual file names and you can use wildcard characters. The mget command copies each file individually, asking you for confirmation each time. Close the ftp connections.

Can FTP transfer multiple files?

The FTP get and put commands only transfer single files. To transfer multiple files, you can use the commands mget and mput .

How do I transfer files using FTP?

To do this, open a Windows' File Explorer window and type ftp://[server name] or ftp://X.X.X.X where 'X' symbolizes the IP address of the FTP server, e.g. the IP address of your cRIO controller. You can then copy and paste files to or from the server like you would do with any normal folder on your storage as well.


2 Answers

Use this code, just replace the user credentials:

static void Main(string[] args)
{
    FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://mywebsite.com/");
    ftpRequest.Credentials = new NetworkCredential("user345", "pass234");
    ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
    FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
    StreamReader streamReader = new StreamReader(response.GetResponseStream());           
    List<string> directories = new List<string>();            

    string line = streamReader.ReadLine();
    while (!string.IsNullOrEmpty(line))
    {
        directories.Add(line);
        line = streamReader.ReadLine();
    }
    streamReader.Close();


    using (WebClient ftpClient = new WebClient())
    {
        ftpClient.Credentials = new System.Net.NetworkCredential("user345", "pass234");

        for (int i = 0; i <= directories.Count-1; i++)
        {
            if (directories[i].Contains("."))
            {

                string path = "ftp://mywebsite.com/" + directories[i].ToString();
                string trnsfrpth = @"D:\\Test\" + directories[i].ToString();
                ftpClient.DownloadFile(path, trnsfrpth);
            }
        }
    }
like image 129
Cherry Avatar answered Sep 30 '22 22:09

Cherry


Very Great and simple library FluentFTP

Check it out;

My config file:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> <appSettings> <add key="FtpHost" value="127.0.0.1"/> <add key="FtpUser" value="username"/> <add key="FtpPassword" value="password123"/> <add key="FtpDirectory" value="/INTERESTING FILES/DATA"/> <add key="FileExtension" value=".txt"/> <add key="DownloadTo" value="C:\Downloads"/> <add key="DeleteFilesAfterDownload" value="false"/> </appSettings> </configuration>

And a little FTP Library:

namespace FTPDownloadAdapter {
    class Program
    {
        private static readonly string FtpHost = ConfigurationManager.AppSettings["FtpHost"];
        private static readonly string FtpUser = ConfigurationManager.AppSettings["FtpUser"];
        private static readonly string FtpPassword = ConfigurationManager.AppSettings["FtpPassword"];
        private static readonly string FtpDirectory = ConfigurationManager.AppSettings["FtpDirectory"];
        private static readonly string FileExtension = ConfigurationManager.AppSettings["FileExtension"];
        private static readonly string DownloadTo = ConfigurationManager.AppSettings["DownloadTo"];
        private static readonly string DeleteFilesAfterDownload = ConfigurationManager.AppSettings["DeleteFilesAfterDownload"];

        static void Main(string[] args)
        {


            try{


                DownloadFiles();


            }
            catch (Exception er){
                Console.WriteLine(er.ToString());
            }

        }

        private static void DownloadFiles(){

            // create an FTP client
            var client = new FtpClient(FtpHost) { Credentials = new NetworkCredential(FtpUser, FtpPassword) };

            // if you don't specify login credentials, we use the "anonymous" user account


            // begin connecting to the server
            client.Connect();


            Console.WriteLine($"Retrieving files with extension [{FileExtension}] from directory [{FtpDirectory}]");



            foreach (FtpListItem item in client.GetListing(FtpDirectory)){

                // if this is a file
                if (item.Type == FtpFileSystemObjectType.File && (Path.GetExtension(item.FullName) == FileExtension)){

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

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

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

                    // download the file 
                    var fileName = Path.GetFileName(item.FullName);
                    var saveFilePath = Path.Combine(DownloadTo, fileName ?? throw new InvalidOperationException("File Appears to not have a name"));

                    Console.WriteLine($"Downloading file: {fileName}");

                    client.DownloadFile(localPath: saveFilePath, remotePath: item.FullName);

                    if (DeleteFilesAfterDownload == "true")
                    {
                        Console.WriteLine($"DeleteFilesAfterDownload is true, Deleting file from FTP : {item.FullName}");

                        client.DeleteFile(item.FullName);

                        Console.WriteLine("File deletion success");
                    }
                    else
                    {

                        Console.WriteLine($"DeleteFilesAfterDownload not true, skip deleting : {item.FullName}");

                    }

                }
            }
        }
    }
}
like image 40
Dr Manhattan Avatar answered Sep 30 '22 21:09

Dr Manhattan