检测javanio中移动的文件

检测javanio中移动的文件,java,nio,Java,Nio,我正在写一个程序来复制用户在一台计算机上所做的,然后在另一台计算机上重复。基本上是计算机之间的同步程序 我成功地复制了创建和删除事件,甚至部分修改了文件,但在文件夹之间移动的文件有点问题 不是每个文件夹都在我的监视之下,我的程序可以监视几个文件夹。因此,我为来自许多不同观察者的所有操作创建了一个组合日志。但对于那些在我的观察者之下的人,他们在我的日志上显示为创建和删除的事件。我目前的方法是延迟所有进程,并批量传输日志 到目前为止,它运行良好,但我一直认为,这种方法是不可靠的检测移动。例如,如果文

我正在写一个程序来复制用户在一台计算机上所做的,然后在另一台计算机上重复。基本上是计算机之间的同步程序

我成功地复制了创建和删除事件,甚至部分修改了文件,但在文件夹之间移动的文件有点问题

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

到目前为止,它运行良好,但我一直认为,这种方法是不可靠的检测移动。例如,如果文件被移动,它将生成删除+创建事件。如果另一次更新的到期时间以及这两个事件中的一个未被捕获,该怎么办?例如,观察者注册了一个删除事件,然后在注册创建事件之前,日志是否已发送?这样,另一台计算机将删除一个文件,然后在下一个到期操作中,由于创建延迟事件,它将不得不再次下载该文件。它只是还没有发生,因为我的电脑只是一个测试环境。但现实生活中的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将被删除

请注意,正如你们可能已经注意到的,我不是在问如何编写watcher代码。我已经成为了我的守望者,它正在发挥作用。尽管有时不幸的移动操作成本很高。我正在寻找一种方法来知道删除操作是否会有另一个创建操作


谢谢你

没有一种便携的方法可以做到这一点,但请看是的。我知道了,谢谢。有没有办法检测这些移动,因为我想避免删除移动的东西。我目前正在使用延迟操作方法,并等待一段时间,直到日志被发送,但这并不保证这些移动日志是成对传输的。小文件不会带来任何问题,但是移动大文件(如视频)可能会浪费不必要的带宽。而且,在记录其他操作之前,我们无法检测哪一个是单个独立操作,哪一个是成对操作。我没有尝试过,但链接中提到的jpathwatch库提供了重命名事件。你可以把活动发出去。好的。。让我试试JPathWatch,没有一种便携的方法可以做到这一点,但请看是的。我知道了,谢谢。有没有办法检测这些移动,因为我想避免删除移动的东西。我目前正在使用延迟操作方法,并等待一段时间,直到日志被发送,但这并不保证这些移动日志是成对传输的。小文件不会带来任何问题,但是移动大文件(如视频)可能会浪费不必要的带宽。而且,在记录其他操作之前,我们无法检测哪一个是单个独立操作,哪一个是成对操作。我没有尝试过,但链接中提到的jpathwatch库提供了重命名事件。你可以把活动发出去。好的。。让我试试jpathwatch