Как я могу загрузить самый старый файл FTP-сервера?

Как я могу загрузить самый старый файл FTP-сервера?

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://192.168.47.1/DocXML");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential("Igor", "");

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

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

string names = reader.ReadLine();

textBox12.Text = names; 

1 ответ

Решение

Как я могу загрузить самый старый файл FTP-сервера?

С помощью WebRequestMethods.Ftp.ListDirectoryDetails

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

В зависимости от сервера ftp, он может возвращать строки в таком формате:

08-10-11  12:02PM       <DIR>          Version2
06-25-09  02:41PM            144700153 image34.gif
06-25-09  02:51PM            144700153 updates.txt
11-04-10  02:45PM            144700214 digger.tif

Или же

d--x--x--x    2 ftp      ftp          4096 Mar 07  2002 bin
-rw-r--r--    1 ftp      ftp        659450 Jun 15 05:07 TEST.TXT
-rw-r--r--    1 ftp      ftp     101786380 Sep 08  2008 TEST03-05.TXT
drwxrwxr-x    2 ftp      ftp          4096 May 06 12:24 dropoff

Или даже другой формат.

Эта запись блога "Пример кода для анализа ответа FtpwebRequest для ListDirectoryDetails" содержит пример обработки нескольких форматов.

Если вы знаете, что это за формат, просто создайте для него специальный минимальный анализатор строк.

С помощью WebRequestMethods.Ftp.ListDirectory с WebRequestMethods.Ftp.GetDateTimestamp

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

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

public static IEnumerable<string> ListDirectory(string uri, NetworkCredential credentials)
{
    var request = FtpWebRequest.Create(uri);
    request.Method = WebRequestMethods.Ftp.ListDirectory;
    request.Credentials = credentials;
    using (var response = (FtpWebResponse)request.GetResponse())
    using (var stream = response.GetResponseStream())
    using (var reader = new StreamReader(stream, true))
    {
        while (!reader.EndOfStream)
            yield return reader.ReadLine();
    }
}

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

public static DateTime GetLastModified(string fileUri, NetworkCredential credentials) 
{
    // error checking omitted
    var request = FtpWebRequest.Create(fileUri);
    request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
    request.Credentials = credentials;
    using (var response = (FtpWebResponse)request.GetResponse())
        return response.LastModified;
}

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

var credentials = new NetworkCredential("Igor", "");
var filesAndDates = ListDirectory("ftp://192.168.47.1/DocXML", credentials)
    .Select(fileName => new {
        FileName = fileName,
        LastModified = GetLastModified("ftp://192.168.47.1/DocXML/" + fileName, credentials)
    })
    .ToList();
// find the oldest entry.
var oldest = filesAndDates.OrderBy(x => x.LastModified).FirstOrDefault();
Другие вопросы по тегам