2010-12-15 3 views
15

Я использую System.Net.FtpWebRequest класс, и мой код выглядит следующим образом:Получение даты создания файла (FTP)

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, но как я могу теперь перебирать каждую из них и получать их даты? Я хочу получить даты, чтобы найти самые новые файлы. Благодарю.

+0

Я довольно уверен, что FTP только имеет поддержку для измененных дат, а не для дат создания. – Nyerguds 2016-03-23 13:01:30

ответ

14

WebRequestMethods.Ftp.ListDirectory возвращает «короткий список» всех файлов в каталоге FTP. Этот тип листинга будет содержать только имена файлов, а не дополнительные сведения о файле (например, разрешения или последнюю измененную дату).

Используйте вместо этого WebRequestMethods.Ftp.ListDirectoryDetails. Этот метод вернет длинный список файлов на FTP-сервере. После того как вы извлекли этот список в переменную names, вы можете разбить переменную names на массив на основе символа конца строки. Это приведет к тому, что каждый элемент массива будет списком имен файлов (или каталогов), который включает разрешения, последний измененный владелец даты и т. Д.

На этом этапе вы можете перебирать этот массив, проверять последнюю измененную дату для каждого файла и решить, загружать ли файл.

Я надеюсь, что это поможет!

+2

Работает теоретически, но ответ с FTP-сервера значительно усложняет ситуацию. – Radu 2010-12-16 20:14:06

+1

Если вы можете поделиться ответом, получаемым с сервера, возможно, я смогу предоставить дополнительную помощь. Мой ответ был преднамеренно родовым, потому что фактический ответ с сервера будет варьироваться от сервера к серверу. – pmartin 2010-12-16 20:35:21

+1

просто для того, чтобы уточнить, это * измененная дата * дата * не создана *, что и было предложено, правильно? – 2016-03-03 14:10:16

-1

Сначала вам нужно разбить имена, используя String.Split в разделителе имени файла. Затем перебирайте все строки и перемещайтесь по каталогам

+0

Команда ListDirectory не предоставляет никаких подробностей о файлах, разделить нечего. – brablc 2015-05-19 08:14:08

14

К сожалению, нет действительно надежный и эффективный способ получения меток времени, используя возможности, предлагаемые платформы .NET, поскольку он не поддерживает команду FTP MLSD. Команда MLSD предоставляет список удаленных каталогов в стандартном машиночитаемом формате. Команда и формат стандартизированы RFC 3659.

Альтернативы, которые можно использовать, которые поддерживаются платформы .NET:

  • ListDirectoryDetails метод (команда FTP LIST), чтобы получить информацию обо всех файлов в каталоге, а затем вы имеете дело с FTP-сервера определенного формата деталей (формат * nix, аналогичный команде ls * nix, является наиболее распространенным, недостатком является то, что формат может меняться со временем, так как для более старых файлов используется формат «8 мая 17:48», а для более старых файлов - октябрь 18 2009 »).

    формат DOS/Windows: C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
    * Формат Никс: Parsing FtpWebRequest ListDirectoryDetails line

  • 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 assembly поддерживает это.

Есть даже пример для вашей конкретной задачи: Downloading the most recent file.
Пример для 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)

Смежные вопросы