Как я могу загрузить самый старый файл 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();