2015-05-15 5 views
2

Мне нужно загрузить последний файл с FTP-сервера. Я знаю, как загрузить последний файл с моего компьютера, но я не загружаю с FTP-сервера.Загрузите последний файл с FTP-сервера

Как загрузить последний файл с FTP-сервера?

Это моя программа, чтобы загрузить последнюю версию файла с моего компьютера

public Form1() 
    { 
     InitializeComponent(); 

     string startFolder = @"C:\Users\user3\Desktop\Documentos XML"; 

     System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder); 

     IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories); 

     IEnumerable<System.IO.FileInfo> fileQuerry = 
      from file in fileList 
      where file.Extension == ".txt" 
      orderby file.CreationTimeUtc 
      select file; 

     foreach (System.IO.FileInfo fi in fileQuerry) 
      { 
       var newestFile = 
       (from file in fileQuerry 
       orderby file.CreationTimeUtc 
       select new { file.FullName, file.Name }) 
       .First(); 
       textBox2.Text = newestFile.FullName; 
      } 
    } 

ОК, с помощью этого кода я знаю дату последнего файла, но как я знаю имя этого файла ???? ????

+1

Слишком широкие и возможно дубликат [Извлечение даты создания файл (FTP)] (http://stackoverflow.com/questions/4454281/retrieving-creation-date-of-file-ftp) –

+0

Спасибо! Я помещаю код, и у меня есть ошибки с 'FtpWebRequest request' и' WebRequestMethods', и я помещаю 'using System.Net.FtpWebRequest; 'и ничего, у меня есть те же ошибки – garci

+0

С вашего вопроса, я предполагаю, что вы хотите загрузить последний файл с FTP-сервера. –

ответ

3

Вы должны получить временные метки удаленных файлов, чтобы выбрать последний.

К сожалению, нет надежного и эффективного способа получить временные метки изменений всех файлов в каталоге с использованием функций, предлагаемых платформой .NET, поскольку она не поддерживает команду FTP MLSD. Команда MLSD предоставляет список удаленных каталогов в стандартном машиночитаемом формате. Команда и формат стандартизированы RFC 3659.

Альтернативы, которые можно использовать, которые поддерживаются платформы .NET:

  • ListDirectoryDetails method (командование FTP LIST), чтобы получить информацию обо всех файлов в каталоге, а затем вы имеете дело с FTP-сервера определенного формата детали формата

    DOS/Windows: C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
    * формат Никс: Parsing FtpWebRequest ListDirectoryDetails line

  • GetDateTimestamp method (команда FTP MDTM) для индивидуального получения временных меток для каждого файла. Преимущество заключается в том, что ответ стандартизирован на RFC 3659 до YYYYMMDDHHMMSS[.sss]. Недостатком является то, что вам нужно отправить отдельный запрос для каждого файла, что может быть весьма неэффективным. Этот метод использует LastModified property, что вы говорите:

    const string uri = "ftp://example.com/remote/path/file.txt"; 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri); 
    request.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
    Console.WriteLine("{0} {1}", uri, response.LastModified); 
    

В качестве альтернативы вы можете использовать реализацию клиента FTP третьей стороны, которая поддерживает современную MLSD команды.

Например, WinSCP .NET assembly поддерживает это.

Есть даже пример для вашей конкретной задачи: Downloading the most recent file.
Пример для PowerShell и SFTP, но переводит на C# и FTP легко:

// Setup session options 
SessionOptions sessionOptions = new SessionOptions 
{ 
    Protocol = Protocol.Ftp, 
    HostName = "example.com", 
    UserName = "username", 
    Password = "password", 
}; 

using (Session session = new Session()) 
{ 
    // Connect 
    session.Open(sessionOptions); 

    // Get list of files in the directory 
    string remotePath = "/remote/path/"; 
    RemoteDirectoryInfo directoryInfo = session.ListDirectory(remotePath); 

    // Select the most recent file 
    RemoteFileInfo latest = 
     directoryInfo.Files 
      .OrderByDescending(file => file.LastWriteTime) 
      .First(); 

    // Download the selected file 
    string localPath = @"C:\local\path\"; 
    string sourcePath = RemotePath.EscapeFileMask(remotePath + latest.Name); 
    session.GetFiles(sourcePath, localPath).Check(); 
} 

(я автор WinSCP)

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