Получение даты создания файла (FTP) - PullRequest
15 голосов
/ 15 декабря 2010

Я использую класс 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 ]

26 голосов
/ 27 сентября 2011

Это, кажется, работает просто отлично 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);
14 голосов
/ 18 мая 2015

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

14 голосов
/ 16 декабря 2010

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

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

Надеюсь, это поможет !!

0 голосов
/ 15 декабря 2010

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

...