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

2022-09-01 18:39:06

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

我无法控制服务器上的写入过程。此外,我对目录没有写入权限来尝试获取写入句柄以检查是否已经打开了写句柄,因此此选项不在表中。

是否有 FTP 函数可以解决此问题?


答案 1

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

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

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

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


答案 2

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

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

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

接收端将观察到的只是传入流的关闭;无法保证数据不会是部分传输。

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