Получение даты создания файла (FTP)
Я использую System.Net.FtpWebRequest
класс и мой код выглядит следующим образом:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://example.com/folder");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential("username", "password");
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string names = reader.ReadToEnd();
reader.Close();
response.Close();
это основано на примерах, приведенных в MSDN, но я не мог найти ничего более подробного.
Я сохраняю все имена файлов в папке в names
но как я могу теперь перебрать каждый из них и получить их даты? Я хочу восстановить даты, чтобы найти новые файлы. Спасибо.
4 ответов
WebRequestMethods.Ftp.ListDirectory
возвращает "короткий список" всех файлов в каталоге FTP. Этот тип списка будет предоставлять только имена файлов, а не дополнительные сведения о файле (например, разрешения или дата последнего изменения).
использовать WebRequestMethods.Ftp.ListDirectoryDetails
вместо. Этот метод вернет длинный список файлов на FTP-сервере. После того, как вы восстановили этот список в names
переменная, вы можете разделить names
переменная в массив на основе символа конца строки. Это приведет к каждому элемент массива - это список имен файлов (или каталогов), включающий разрешения, владельца последней измененной даты и т. д...
на этом этапе вы можете выполнить итерацию по этому массиву, изучить последнюю измененную дату для каждого файла и решить, загружать ли файл.
надеюсь, это поможет!!
Это, кажется, работает просто отлично http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse.lastmodified(v=VS.90).aspx
FtpWebRequest request = (FtpWebRequest)WebRequest.Create (serverUri);
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
FtpWebResponse response = (FtpWebResponse)request.GetResponse ();
Console.WriteLine ("{0} {1}",serverUri,response.LastModified);
к сожалению, нет действительно надежного и эффективного способа получения временных меток с помощью функций, предлагаемых .NET framework, поскольку он не поддерживает FTP . The MLSD
команда предоставляет список удаленного каталога в стандартизированном машиночитаемом формате. Команда и формат стандартизированы по RFC 3659.
альтернативы, которые вы можете использовать, поддерживаемые .NET framework:
-
ListDirectoryDetails
метод (FTPLIST
команда), чтобы получить сведения обо всех файлах в каталоге, а затем вы имеете дело с FTP-сервером определенного формата деталей (*Nix формат похож наls
*команда nix является наиболее распространенной, недостатком является то, что формат может меняться со временем, так как для новых файлов используется формат "8 мая 17:48" и для старых файлов используется формат "18 октября 2009").формат DOS/Windows:класс C# для разбора WebRequestMethods.Программа передачи файлов.ListDirectoryDetails ФТП ответ
*формат шухер: синтаксический анализ строки Ftpwebrequest ListDirectoryDetails -
GetDateTimestamp
метод (FTPMDTM
command) для индивидуального извлечения меток времени для каждого файла. Преимуществом является то, что ответ стандартизирован на RFC 3659 toYYYYMMDDHHMMSS[.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-клиента, которая поддерживает modern .
WinSCP .NET assembly поддерживает.есть даже пример для вашей конкретной задачи:Скачать файл.
Пример предназначен для 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)
сначала вам нужно будет разбить имена, используя String.Split
на имя разделителя. Затем повторите все строки и перейдите по каталогам