![FTP 服务器文件在上传期间被锁定](https://linux22.com/image/1548580/FTP%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%96%87%E4%BB%B6%E5%9C%A8%E4%B8%8A%E4%BC%A0%E6%9C%9F%E9%97%B4%E8%A2%AB%E9%94%81%E5%AE%9A.png)
应用程序定期轮询目录以查找通过 FTP 到达的输入 csv 文件,因此该计算机上运行着一个 FTP 服务器(当前为 Filezilla 服务器)。
问题是,如果当应用程序决定轮询位置时文件正在上传,那么该文件将被锁定,并且应用程序会抛出各种难看的错误,从而破坏用户体验。
现在假设我无法修改应用程序以等待,有什么可以解决此问题的方法吗?例如,上传完成后服务器会自动移动或重命名文件吗?还是等上传完成后再保存文件?或者是否有其他服务器提供此类解决方案?
答案1
我建议使用这种方法,即应用程序不轮询其他进程(在本例中为 FTP 服务器)用于写入的位置。相反,在文件到达应用程序轮询的位置后,将进程设置为 rnfr/rnto(原子操作)文件...您应该尝试对文件进行读锁定,如果失败,则跳过它直到下一次尝试。另一种方法是使用标记文件,该文件将在文件批次中最后到达,并向您的轮询应用程序发出信号,表示它可以开始处理 csv 文件
答案2
我已经通过以下方法解决了同样的问题:
- 连接到 FTP
- 将文件列表放入数组中(过滤掉 .end 文件)
- 重命名数组中的每个文件(在文件名中添加 .end)
- 如果重命名时出错,请跳过该文件(意味着该文件仍由其他应用程序上传)
- 下载每个 *.end 文件并删除(或重命名为 .fin 等)