检测在Java nio中移动的文件

时间:2016-11-20 20:02:59

标签: java nio

我正在编写一个程序来复制用户在一台计算机上执行的操作,并在另一台计算机中重复。基本上是计算机之间的同步程序。

我已经成功复制了创建和删除事件,甚至是部分修改过的文件,但我对文件夹之间移动的文件有一点问题。

并非每个文件夹都在我的观察者下面,我的程序可以监视多个文件夹。因此,我为来自许多不同观察者的所有操作制作了组合日志。但对于那些在我的观察者下的人,他们在我的日志中显示为已创建和已删除的事件。我目前的方法是延迟所有进程,并批量传输日志。

到目前为止它运行良好,但我一直在想,这种方法对于检测移动是不可靠的。例如,如果文件移动,它将生成delete + create事件。如果到达另一次更新的时间,并且未捕获这两个事件中的一个,该怎么办?例如,观察者注册一个删除事件,然后在注册创建事件之前,日志被发送?这样,另一台计算机将删除一个文件,然后进行下一次正常操作,由于后期创建事件,它将不得不再次下载该文件。它还没有发生,因为我的计算机只是一个测试环境。但是现实生活中的PC将同时移动和创建多个文件。删除事件很简单,但是后期创建事件会产生问题,尤其是对于大文件。

等待第二个事件的安全阈值是多少毫秒?或者更好的是,在传输日志之前,有没有其他好方法可以检测这两个事件是否完整可靠?

更新: 让我说清楚。日志显示为以下示例:

create file A
delete file B
create file B
delete file C
-> log transmitted
create file C
create file D
modify file E
-> log transmitted

在此示例中,服务器将执行两次同步。现在,文件B没有问题,因为我的程序在第一次登录时检测到两个操作上的B指纹,并相应地移动文件B,但是必须重新传输文件C.我的问题是,有没有办法在等待创建日志时如何防止C被删除?

更新:

如果我将IO操作日志并行发送到远程计算机,则会发生这种情况:

create file A
-> log transmitted
delete file B
-> log transmitted
create file B
-> log transmitted
delete file C
-> log transmitted
create file C
-> log transmitted
create file D
-> log transmitted
modify file E
-> log transmitted

当观察者发送创建操作时,文件B和C将被删除。

请你,你可能已经注意到了,我不是在问如何编码观察者。我做了我的观察者,这是工作。虽然不幸的移动操作有时会花费很高的成本。我正在寻找一种方法来知道删除操作是否会或将不会有另一个创建操作。

谢谢

0 个答案:

没有答案