Как загрузить множество файлов с FTP с помощью C#?

Мне нужно запускать консольное приложение через запланированные промежутки времени, которое должно загружать только файлы .pgp с FTP-сайта. Любой файл pgp на FTP должен быть загружен. Я нашел пример кода для получения списка каталогов FTP и написал это здесь:

FtpWebRequest req = (FtpWebRequest)WebRequest.Create("ftp://ourftpserver");
        req.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

        req.Credentials = new NetworkCredential("user", "pass");

        FtpWebResponse response = (FtpWebResponse)req.GetResponse();

        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        Console.WriteLine(reader.ReadToEnd());

        Console.WriteLine("Directory List Complete, status {0}", response.StatusDescription);

        reader.Close();
        response.Close();

Что я должен сделать, чтобы загрузить все файлы типа .pgp из списка каталогов и сохранить их в локальном каталоге на нашем сервере?


person SidC    schedule 07.08.2013    source источник
comment
Разберите ответ и используйте цикл.   -  person SLaks    schedule 07.08.2013
comment
SLaks Не могли бы вы уточнить пример кода?   -  person SidC    schedule 07.08.2013


Ответы (4)


Объекты FtpWebRequest и FtpWebResponse действительно предназначены для выполнения отдельных запросов (т. е. загрузки отдельных файлов и т. д.).

Вы ищете FTP-клиент. В .NET Framework его нет, но есть бесплатный System.Net.FtpClient, который, по-видимому, работает достаточно хорошо.

person Jim Mischel    schedule 07.08.2013
comment
Большое спасибо! Я прочитал так много сообщений на этом сайте, MSDN и других, но ваша информация прямая и по делу. Очень признателен. Сейчас скачаю :) - person SidC; 08.08.2013

Существует очень хорошая библиотека, которую вы можете использовать https://sshnet.codeplex.com/ Фрагмент кода: вам нужно чтобы передать путь к папке, в которую вы хотите загрузить файлы, как localFilesPath и путь к папке Ftp, откуда вы хотите загрузить, как удаленный FTPPath.

public static void DownloadFilesFromFTP(string localFilesPath, string remoteFTPPath)
        {
            using (var sftp = new SftpClient(Settings.Default.FTPHost, Settings.Default.FTPUsername, Settings.Default.FTPPassword))
            {
                sftp.Connect();
                sftp.ChangeDirectory(remoteFTPPath);
                var ftpFiles = sftp.ListDirectory(remoteFTPPath, null);
                StringBuilder filePath = new StringBuilder();
                foreach (var fileName in ftpFiles)
                {

                    filePath.Append(localFilesPath).Append(fileName.Name);
                    string e = Path.GetExtension(filePath.ToString());
                    if (e == ".csv")
                    {
                        using (var file = File.OpenWrite(filePath.ToString()))
                        {
                            sftp.DownloadFile(fileName.FullName, file, null);
                            sftp.Delete(fileName.FullName);
                        }
                    }
                    filePath.Clear();
                }
                sftp.Disconnect();
            }
        }
person Thakur Rock    schedule 30.12.2014
comment
Начал использовать это на основе этого ответа, очень приятно! - person Michael A; 20.07.2015

код для загрузки файла с ftp.

        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.0/my.txt");
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.Credentials = new NetworkCredential("userid", "pasword");
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        FileStream file = File.Create(@c:\temp\my.txt);
        byte[] buffer = new byte[32 * 1024];
        int read;
        //reader.Read(

        while ((read = responseStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            file.Write(buffer, 0, read);
        }

        file.Close();
        responseStream.Close();
        response.Close();
person Chandresh Singh Rathore    schedule 01.10.2013

Ultimate FTP может вам помочь. Следующий фрагмент кода демонстрирует, что:

using ComponentPro.IO;
using ComponentPro.Net;

...

// Create a new instance.
Ftp client = new Ftp();

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

// Authenticate.
client.Authenticate("userName", "password");

// ...

// Get all directories, subdirectories, and files from remote folder '/myfolder' to 'c:\myfolder'.
client.DownloadFiles("/myfolder", "c:\\myfolder");

// Get all directories, subdirectories, and files that match the specified search pattern from remote folder '/myfolder2' to 'c:\myfolder2'.
client.DownloadFiles("/myfolder2", "c:\\myfolder2", "*.pgp");

// or you can simply put wildcard masks in the source path, our component will automatically parse it.
// download all *.pgp files from remote folder '/myfolder2' to local folder 'c:\myfolder2'.
client.DownloadFiles("/myfolder2/*.pgp", "c:\\myfolder2");

// Download *.pgp files from remote folder '/myfolder2' to local folder 'c:\myfolder2'.
client.DownloadFiles("/myfolder2/*.pgp", "c:\\myfolder2");

// Get files in the folder '/myfolder2' only.
TransferOptions opt = new TransferOptions(true, RecursionMode.None, false, (SearchCondition)null, FileExistsResolveAction.Overwrite, SymlinksResolveAction.Skip);
client.DownloadFiles("/myfolder2", "c:\\myfolder2", opt);

// ...

// Disconnect.
client.Disconnect();

http://www.componentpro.com/doc/ftp содержит больше примеров.

person Alexey Semenyuk    schedule 13.01.2015
comment
Обратите внимание, что это платная библиотека, и не самая лучшая. Избежал бы. Много хороших бесплатных решений! - person Michael A; 20.07.2015