2013-08-07 5 views
3

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

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 из каталога листинга и сохранить их в локальный каталог на нашем сервере?

+0

Разберите ответ и используйте цикл. – SLaks

+0

SLaks Не могли бы вы продумать образец кода? – SidC

ответ

8

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

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

+0

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

1

код для скачивания файла с 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(); 
3

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

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(); 
      } 
     } 
+0

Начал использовать это на основе этого ответа, очень приятно! – Codingo

1

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 имеет больше примеров.

+3

Обратите внимание, что это платная библиотека, а не отличная. Во избежание. Много хороших бесплатных решений! – Codingo

Смежные вопросы