在文件尚未上传时从ftp服务器下载文件

时间:2017-02-09 14:23:14

标签: c# ftp ftp-client

我需要在不同的域上跨不同的FTP服务自动拉取(获取)各种文件,并且每周7天,每天24小时接收文件。

我的问题是,FTP服务通常允许在文件上传时下载文件。 This是可以在互联网上找到的问题的参考之一。

这可能会导致文件下载不完整。

我尝试使用Windows服务器和ftp FileZilla客户端复制情况,并按预期获得了一半的文件,因此没有安全机制来防止这种情况。所以可能很简单,没有办法阻止它从客户端。

所以我的问题是,如果有一些锚点,我的客户端可以测试以确定ftp服务器已经作为文件的整体。

我发现很难相信协议已经过时了,因为ftp没有提供安全机制,所以我必须遗漏一些东西,或者这是设计的。

更新 我正在使用C#开发自动化,但任何技术提示都可以提供帮助。解决方案需要愚弄教授,因为它对业务至关重要。

UPDATE2 上传是由许多不同的客户端进行的,因此无法与所有客户建立约定。

UPDATE3 此问题类似于问题How to detect that a file is being uploaded over FTP,但在update2中提供了额外的限制。

4 个答案:

答案 0 :(得分:1)

我根据本帖和其他人的答案输入创建了以下自动化解决方案,以解决我的问题,意思是:在并发性很像的情况下,从不同品牌的不同FTP服务器中提取文件即将发生。

在这篇文章中使用信号文件或其他机制会要求强制客户改变他们与我们交互的方式,因此它是大多数情况下的解决方案,但不是我特定问题的解决方案。

所以,我的解决方案是:

  1. 扫描文件夹,解析每个文件的文件名,数据和大小。
  2. 丢弃任何太新的文件。仅当文件日期早于几分钟时才考虑下载。挂起可能会导致此规则无法阻止并发。
  3. 重命名文件。它失败了,跳出来。这种基于并发性的方法到目前为止已被证明是100%准确的。
  4. 下载重命名的文件。
  5. 检查转移的大小,看看是否匹配大小属性(偏执检查)
  6. 从ftp服务器删除成功传输的文件。
  7. 此解决方案允许我们密集地轮询ftp文件夹。

答案 1 :(得分:0)

我相信从客户端来说,你无能为力。

最多,您可以在一段时间后重新检查文件大小,看看它是否已更改并采取获取新内容所需的任何步骤。

答案 2 :(得分:0)

FTP不是设计用于使用FTP服务器在两个客户端之间进行实时数据交换的协议。如果仍然上传要下载的文件,则不会向客户端发送任何通知,也不会在覆盖某人当前下载此文件的文件时发出任何指示。这不是FTP协议中的设计错误。真正的问题是,您正在尝试将协议用于不是为其设计的目的。

答案 3 :(得分:0)

所以你有这个场景:

[Publisher] --uploads file--> [FTP Server] --downloads file--> [You]

您有一位发布商正在将文件上传到FTP服务器,您可以从同一台FTP服务器下载。也可以有不同的FTP服务器实例,一个用于上传,一个用于下载,查看相同的目录,但这并没有太大的变化。

现在因为您正在查看同一目录,您,下载者会在创建文件系统条目后立即查看文件 - 当发布者的第一个字节可能仍在运行时。

基本上有三种解决方案:

  • Sentinel文件,由FTP服务器或插件编写。一个" $ originalFileName.lock"在上传文件时存在,或者在上传成功完成时写入" $ originalFileName.done&#34 ;.
  • 将文件移动到不同的目录:FTP服务器将文件从发布者写入的上载目录移动到您从中读取的下载目录。
  • 最不稳定:检查文件大小和时间。开始下载时,请记住FTP服务器报告的文件的时间戳和大小。当您下载完文件后,请将您的值与记住的值进行比较。当他们不匹配时,从你完成的地方恢复下载,以获得剩余的字节,adinititum。例如,您可以确定"如果文件的大小没有增长五分钟,那么该文件已成功上传,但这不是很强大 - 并且可以因为你什么都不等五分钟。