如何使用FTP知道服务器上的文件是否完整?

时间:2013-01-22 05:59:15

标签: java ftp download

我有一个Java文件扫描程序,它使用FTP扫描服务器上的目录。获取目录的文件列表并逐个下载。另一方面,在服务器上,有一个写入这些文件的进程。如果我很幸运,我不会尝试下载不完整的文件但是如何确定服务器上的写入过程是否完整且文件句柄是否已关闭,文件是否已准备好下载?

我无法控制服务器上的写入过程。此外,我没有对目录的写权限,试图获取一个写句柄,以检查是否已经打开了一个写句柄,所以这个选项不在桌面上。

是否有解决此问题的FTP功能?

4 个答案:

答案 0 :(得分:22)

这是一个非常古老而众所周知的问题。

无法绝对确定FTP守护程序正在写入的文件是否完整。甚至可能是文件传输失败然后重新启动并完成。您必须轮询文件的大小并设置时间限制,例如5分钟。如果在此期间大小没有变化,则假定文件已完成。

如果可能,处理文件的程序应该能够处理部分文件。

更好的替代方案是rsync,它更加强大和确定性。它甚至可以配置(通过命令行选项)将数据最初写入临时位置,并在成功完成后将其移动到其最终目标路径。如果文件存在于您期望的位置,那么根据定义它是完整的。

答案 1 :(得分:12)

一种可能的解决方案是首先使用不同的文件名上传文件(例如添加“.partial”),然后将其重命名为其最终名称。

如果服务器找到最终名称,则上传已完成。

如果您无法控制上传过程,那么根据定义您所要求的内容是不可能的:文件上传可能会因网络问题或因任何原因停止发送过程而停止。

接收端将观察到的只是关闭传入流;没有办法保证数据不会是部分转移。

其他解决方法可能是检查数据结束标记或使用发送服务器请求检查(在他们看来)传输是否已完成。

答案 2 :(得分:7)

这比FTP更基础:即使在本地计算机上创建这些文件,您也会遇到类似的问题。

如果你不能修改写作过程,你需要跳过一些箍。没有一个是伟大的,但有些比其他更安全。

  • 继续阅读,直到某些窗口没有任何变化(也许一分钟,就像David Schwartz建议的那样)。您可以通过观察文件大小来优化这一点。
  • 确定文件是否以可靠的顺序连续编写。当您看到文件N出现时,您知道文件N-1已准备就绪。 (假设在写入文件之前目录为空,但您也可以查看时间戳。)缺点是如果编写者改变顺序或开始并行编写,您的逻辑将会中断。

可靠,安全的解决方案需要改进编写程序。

  • Writer可以将文件写入隐藏或临时位置,只有在整个文件(或目录)准备好后,才能使用符号链接或文件移动或chmod使它们可见。
  • 只有在写完所有其他文件后,Writer才会创建一个特殊文件(例如“./DONE”),并且在该文件存在之前,读者不会读取任何文件。
  • 根据文件类型,编写者可以在文件末尾添加某种文件结尾记录/行,读者可以确保它存在。

答案 3 :(得分:0)

您可以使用Apache common API中的Ftp库 get more information

 boolean flag = retrieveFile(String remote, OutputStream local);

此标志检查输出流可用于当前文件。