К сожалению, нет действительно надежного и эффективного способа получения меток времени с использованием функций, предлагаемых .NET Framework, поскольку он не поддерживает команду FTP MLSD
.Команда MLSD
предоставляет список удаленных каталогов в стандартном машиночитаемом формате.Команда и формат стандартизированы как RFC 3659 .
Альтернативы, которые вы можете использовать, которые поддерживаются .NET Framework:
ListDirectoryDetails
метод (команда FTP LIST
) для получения сведений обо всех файлах в каталоге, а затем вы работаете с форматом подробностей, специфичным для FTP-сервера (формат * nix, подобный команде ls
* nix, является наиболее распространенным,недостатком является то, что формат может со временем меняться, так как для более новых файлов используется формат «8 мая 17:48», а для более старых файлов используется формат «18 октября 2009»).
Формат DOS / Windows: C # класс для анализа WebRequestMethods.Ftp.ListDirectoryDetails FTP-ответ
* nix формат: Синтаксический анализ строки FtpWebRequest ListDirectoryDetails
GetDateTimestamp
метод ((команда FTP MDTM
) для индивидуального получения меток времени для каждого файла.Преимущество состоит в том, что ответ стандартизирован от RFC 3659 до YYYYMMDDHHMMSS[.sss]
.Недостатком является то, что вы должны отправлять отдельный запрос для каждого файла, что может быть довольно неэффективным.
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 поддерживает это.
Существует даже пример для вашей конкретной задачи: Загрузка наиболеенедавний файл .
Пример приведен для 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)