当前位置: 首页 > 知识库问答 >
问题:

如果文件是在最近一小时内创建的,请从FTP下载文件

章青青
2023-03-14

我需要从FTP上的特定文件夹下载文件,但仅限于创建时间在过去一小时内的文件。所以基本上我需要列出该文件夹中的所有文件,然后只下载时间戳与执行时间相差不超过一小时的文件。关于如何在FTP上解析文件的时间戳,有什么想法吗?我不能使用任何第三方FTP客户端库。

共有3个答案

衡修洁
2023-03-14

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

支持的可使用的备选方案。NET框架:

>

DOS/Windows格式:C#类解析WebRequest方法。ftp。ListDirectory详情FTP响应
*nix格式:解析FtpWebRequest ListDirectory详情行

方法(FTPMDTM命令),分别检索每个文件的时间戳。一个优点是响应由RFC 3659标准化为YYYYMMDDHHMMSS[.sss]。缺点是您必须为每个文件发送单独的请求,这可能效率很低。文件修改时间将解析为“LastModified”属性:

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
}

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

例如WinSCP。NET assembly支持MLSD和时间约束。

您的特定任务甚至有一个示例:如何仅传输新的/修改的文件
此示例适用于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();
}

有关时间约束,请参见语法。

(我是WinSCP的作者)

孙财
2023-03-14

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

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...
                }
            }
        }
咸琪
2023-03-14

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

 类似资料:
  • 我必须从FTP服务器下载最新文件。我知道如何从我的计算机下载最新文件,但我不知道如何从FTP服务器下载。 如何从FTP服务器下载最新文件? 这是我从电脑上下载最新文件的程序 好的,使用此代码我知道最后一个文件的日期,但我如何知道这个文件的名称?????????

  • 我有这个代码来下载一个文件。 这是服务器和密码的一部分。 简单的填充下载,但此行出错 它给了我错误,我希望你能理解我现在面临的问题 java.net.SocketExc0019:软件导致连接中止:套接字写入错误在java.net.SocketOutputStream.socketWrite0(本地方法)在java.net.SocketOutputStream.socket写入(SocketOutp

  • 在FTP服务器上有一些文件。此服务器上的任何时间都在上传新文件。我想下载最后一个文件。如何从此服务器获取上次上传的文件?所有文件都具有不同的名称。 我使用以下脚本下载了一个文件。 提前感谢!!!

  • 问题内容: 例如,我的Ubuntu机器上正在运行MySQL服务器。最近24小时内某些数据已更改。 哪些(Linux)脚本可以找到最近24小时内已更改的文件? 请列出文件名,文件大小和修改时间。 问题答案: 要查找特定特定目录及其子目录中最近24小时(最后一整天)内修改的所有文件,请执行以下操作: 应该是你喜欢的 在之前是非常重要的-这意味着任何改变一天或更短前。相反,“ 之前” 表示至少一天前发生

  • 我只想从s3 bucket inside文件夹下载最新文件。实际上,文件夹中有多个文件夹和文件。但我只需要下载最新日期的文件,并通过从多个文件夹中选择将其上载到一个文件夹中。我指的是stackoverflow源代码中的代码。 下面是s3桶的结构: 所以基本上,我想从文件夹(文件夹_1)内的s3 bucket下载最新文件,而不是从文件夹(文件夹_12、文件夹_13、文件夹_14)内下载最新文件。 我