我正在编写一个应用程序,通过每隔几秒轮询一次目录来监视新输入文件的目录.新文件通常可能是几兆字节,因此需要一些时间才能完全到达输入目录(例如:从远程共享复制).
有没有一种简单的方法来检测文件当前是否正在被复制?理想情况下,任何方法都是平台和文件系统无关的,但是不同的平台可能需要特定的策略.
我已经考虑将两个目录列表分开几秒钟并比较文件大小,但这引入了时间/可靠性权衡,我的上司不满意,除非别无选择.
对于后台,该应用程序被编写为一组Matlab M文件,所以没有JRE/CLR技巧我害怕...
编辑:文件通过直接移动/复制操作直接到达输入,从网络驱动器或本地文件系统上的其他位置.此复制操作可能由人类用户而不是其他应用程序启动.
因此,在文件提供程序上添加控制文件或使用中间临时区域是非常困难的...
结论:似乎没有简单的方法可以做到这一点,所以我已经选择了一种带括号的方法 - 如果出现以下情况,文件已准备好进行处理:
它的大小在一定时间内不会改变,并且
可以以只读模式打开文件(某些复制过程会锁定文件).
感谢大家的回复!
最安全的方法是让放在目录中的文件的应用程序首先将它们放在不同的临时目录中,然后将它们移动到真实的目录(即使使用FTP或文件共享也应该是原子操作) .您还可以使用命名约定在一个目录中实现相同的结果.
编辑: 它真的取决于文件系统,它的复制功能是否具有"已完成文件"的概念.我不太了解SMB协议,但如果它有这个概念,你可以编写一个暴露SMB接口(或补丁Samba)的应用程序和一个API,以获得完整文件副本的通知.可能还有很多工作要做.