C# - 从 FTP 下载具有更高上次修改日期的文件

C# - Download files from FTP which have higher last-modified date

我有一个带有一些文件的 FTP 服务器。我在本地目录中有相同的文件(在 C:\)。

当我 运行 程序时,我希望它搜索 FTP 服务器中的所有文件,这些文件的最后修改时间戳晚于同一文件(同名)本地目录并下载创建的所有文件。

有人可以给我帮助或提示吗?我会感谢所有答案!

列出所有文件:
https://msdn.microsoft.com/en-us/library/ms229716(v=vs.110).aspx

阅读日期:
https://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse.lastmodified(v=vs.110).aspx

不幸的是,没有真正可靠和有效的方法来使用 .NET 框架提供的功能检索时间戳,因为它不支持 FTP MLSD 命令。 MLSD 命令以标准化的机器可读格式提供远程目录列表。命令和格式由 RFC 3659.

标准化

.NET Framework 支持的替代方案:

  • ListDirectoryDetails method(FTPLIST命令)检索目录下所有文件的详细信息然后你处理FTP服务器具体格式详解(*nix格式类似于ls *nix命令是最常见的,缺点是格式可能会随时间变化,至于较新的文件使用“May 8 17:48”格式对于旧文件,使用“2009 年 10 月 18 日”格式。

    示例:
    DOS/Windows格式:C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
    *nix 格式:Parsing FtpWebRequest ListDirectoryDetails line

  • GetDateTimestamp method (an FTP MDTM command) to individually retrieve timestamps for each file. An advantage is that the response is standardized by the RFC 3659YYYYMMDDHHMMSS[.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);
    

或者,您可以使用支持现代 MLSD 命令的第 3 方 FTP 客户端实现。

例如 WinSCP .NET assembly 支持。

您可以使用返回集合中的 Session.ListDirectory or the Session.EnumerateRemoteFiles methods and read the RemoteFileInfo.LastWriteTime 个文件。

或者更简单,您可以使用 Session.SynchronizeDirectories 让库自动下载(同步)修改后的文件:

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "ftp.example.com",
    UserName = "user",
    Password = "mypassword",
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Synchronize files
    var localPath = @"d:\www";
    var remotePath = "/home/martin/public_html";
    session.SynchronizeDirectories(
        SynchronizationMode.Local, localPath, remotePath, false).Check();
}

WinSCP GUI can generate a code template给你。

(我是WinSCP的作者)