Для этого вам нужно получить список удаленных каталогов, включая временные метки.
К сожалению, нет действительно надежного и эффективного способа получения меток времени с использованием функций, предлагаемых .NET Framework, поскольку он не поддерживает команду FTP MLSD
. Команда MLSD
предоставляет список удаленных каталогов в стандартизированном машиночитаемом формате. Команда и формат стандартизированы RFC 3659 .
Альтернативы, которые вы можете использовать, которые поддерживаются платформой .NET (как показывают другие ответы):
метод ListDirectoryDetails
(команда FTP LIST
) для получения сведений обо всех файлах в каталоге, а затем вы работаете с конкретным форматом данных сервера FTP (формат * nix) похож на ls
* nix команда является самой распространенной, недостатком является то, что формат может меняться со временем, так как для более новых файлов используется формат «8 мая 17:48», а для более старых файлов используется формат «18 октября 2009»)
Формат DOS / Windows: Класс C # для анализа WebRequestMethods.Ftp.ListDirectoryDetails FTP-ответ
* nix формат: Синтаксический анализ строки списка FtpWebRequestDirectoryDetails
метод GetDateTimestamp
(команда FTP MDTM
) для индивидуального получения меток времени для каждого файла. Преимущество состоит в том, что ответ стандартизируется от RFC 3659 до YYYYMMDDHHMMSS[.sss]
. Недостатком является то, что вы должны отправлять отдельный запрос для каждого файла, что может быть довольно неэффективным.
const string uri = "ftp://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 поддерживает это.
Вы можете использовать методы Session.ListDirectory
или Session.EnumerateRemoteFiles
и читать RemoteFileInfo.LastWriteTime
файлов в возвращенной коллекции.
Или, что еще проще, вы можете использовать Session.SynchronizeDirectories
, чтобы библиотека автоматически загружала (синхронизировала) измененные файлы:
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "user",
Password = "mypassword",
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Synchronize files
session.SynchronizeDirectories(
SynchronizationMode.Local, @"d:\www", "/remote/path", false).Check();
}
(я автор WinSCP)