Получение даты создания файла (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 метод (FTP LIST команда), чтобы получить сведения обо всех файлах в каталоге, а затем вы имеете дело с FTP-сервером определенного формата деталей (*Nix формат похож на ls *команда nix является наиболее распространенной, недостатком является то, что формат может меняться со временем, так как для новых файлов используется формат "8 мая 17:48" и для старых файлов используется формат "18 октября 2009").

    формат DOS/Windows:класс C# для разбора WebRequestMethods.Программа передачи файлов.ListDirectoryDetails ФТП ответ
    *формат шухер: синтаксический анализ строки Ftpwebrequest ListDirectoryDetails

  • GetDateTimestamp метод (FTP MDTM command) для индивидуального извлечения меток времени для каждого файла. Преимуществом является то, что ответ стандартизирован на RFC 3659 to 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-клиента, которая поддерживает 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 на имя разделителя. Затем повторите все строки и перейдите по каталогам