【问题标题】:Download files from FTP if they are created within the last hour如果文件是在过去一小时内创建的,则从 FTP 下载文件
【发布时间】:2012-04-12 10:38:09
【问题描述】:

我需要从 FTP 上的特定文件夹下载文件,但只下载创建时间在最后一小时内的文件。所以基本上我需要列出该文件夹中的所有文件,然后只下载时间戳与执行时间相差一小时以上的文件。关于如何解析 FTP 上文件的时间戳的任何想法?我不能使用任何 3rd-party FTP 客户端库。

【问题讨论】:

标签: c# .net ftp


【解决方案1】:

主要任务可能不是读取文件时间戳,而是确定它在最后一小时内被修改。如果您的服务器位于同一时区,那么它将与您的时间相同。如果没有,将会有一些时间偏移。如果您一直使用同一台服务器,则可以以相当可靠的方式解决此问题。但是,如果您在世界各地使用多台服务器,那么这会变得有点复杂。所以要注意。

【讨论】:

    【解决方案2】:

    这是我现在想出的。当然有一些更优雅的方式来处理这个但是......

    foreach (var fileName in filesNamesFromFtpFolder)
            {
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(@"ftp://" + host + @"/" + folder + @"/" + fileName);
    
                request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
                request.Proxy = null;
    
                using (FtpWebResponse resp = (FtpWebResponse)request.GetResponse())
                {
                    if (DateTime.Now.Subtract(TimeSpan.FromMinutes(60)) < resp.LastModified)
                    {
                        //download this file...
                    }
                }
            }
    

    【讨论】:

      【解决方案3】:

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

      .NET 框架支持的您可以使用的替代方案:

      • ListDirectoryDetails 方法(FTP LIST 命令)检索目录中所有文件的详细信息,然后处理 FTP 服务器特定格式的详细信息

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

      • GetDateTimestamp 方法(FTP MDTM 命令)单独检索每个文件的时间戳。一个优点是响应由RFC 3659 标准化为YYYYMMDDHHMMSS[.sss]。缺点是您必须为每个文件发送单独的请求,这可能效率很低。文件修改时间为你解析成LastModified property

        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);
        if (response.LastModified > DateTime.Now.Subtract(TimeSpan.FromHours(1)))
        {
            // download
        }
        

      更简单的方法是使用(我知道你不能)支持现代MLSD 命令或可以在给定时间限制的情况下直接下载文件的第 3 方 FTP 客户端实现。

      例如WinSCP .NET assembly 支持MLSDtime constraints

      甚至还有一个针对您的特定任务的示例:How do I transfer new/modified files only?
      该示例适用于 PowerShell,但可以轻松转换为 C#:

      // Setup session options
      SessionOptions sessionOptions = new SessionOptions
      {
          Protocol = Protocol.Ftp,
          HostName = "ftp.example.com",
          UserName = "username",
          Password = "password",
      };
      
      using (Session session = new Session())
      {
          // Connect
          session.Open(sessionOptions);
      
          // Download files modified with the last hour
          TransferOptions transferOptions = new TransferOptions();
          transferOptions.FileMask = "*>=1H";
          session.GetFiles(
              "/remote/path/*", @"C:\local\path\", false, transferOptions).Check();
      }
      

      另请参阅time constraints 的语法。

      (我是 WinSCP 的作者)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-25
        • 1970-01-01
        • 2011-02-21
        相关资源
        最近更新 更多