我有一个Java文件扫描程序,它使用FTP扫描服务器上的目录。获取目录的文件列表并逐个下载。另一方面,在服务器上,有一个写入这些文件的进程。如果我很幸运,我不会尝试下载不完整的文件但是如何确定服务器上的写入过程是否完整且文件句柄是否已关闭,文件是否已准备好下载?
我无法控制服务器上的写入过程。此外,我没有对目录的写权限,试图获取一个写句柄,以检查是否已经打开了一个写句柄,所以这个选项不在桌面上。
是否有解决此问题的FTP功能?
答案 0 :(得分:22)
这是一个非常古老而众所周知的问题。
无法绝对确定FTP守护程序正在写入的文件是否完整。甚至可能是文件传输失败然后重新启动并完成。您必须轮询文件的大小并设置时间限制,例如5分钟。如果在此期间大小没有变化,则假定文件已完成。
如果可能,处理文件的程序应该能够处理部分文件。
更好的替代方案是rsync,它更加强大和确定性。它甚至可以配置(通过命令行选项)将数据最初写入临时位置,并在成功完成后将其移动到其最终目标路径。如果文件存在于您期望的位置,那么根据定义它是完整的。
答案 1 :(得分:12)
一种可能的解决方案是首先使用不同的文件名上传文件(例如添加“.partial”),然后将其重命名为其最终名称。
如果服务器找到最终名称,则上传已完成。
如果您无法控制上传过程,那么根据定义您所要求的内容是不可能的:文件上传可能会因网络问题或因任何原因停止发送过程而停止。
接收端将观察到的只是关闭传入流;没有办法保证数据不会是部分转移。
其他解决方法可能是检查数据结束标记或使用发送服务器请求检查(在他们看来)传输是否已完成。
答案 2 :(得分:7)
这比FTP更基础:即使在本地计算机上创建这些文件,您也会遇到类似的问题。
如果你不能修改写作过程,你需要跳过一些箍。没有一个是伟大的,但有些比其他更安全。
可靠,安全的解决方案需要改进编写程序。
答案 3 :(得分:0)
您可以使用Apache common API中的Ftp库 get more information
boolean flag = retrieveFile(String remote, OutputStream local);
此标志检查输出流可用于当前文件。