如果使用Java为单个文件存在多个符号链接时,如何识别哪个链接修改了目标文件?我无法找到修改目标文件的文件。
示例:D:\sample.txt,D:\folder1\sample.txt
;这两个是链接。目标文件位于E:\sample.txt
。
现在如何确定D:\sample.txt
或D:\folder1\sample.txt
是否修改了E:\sample.txt
?
答案 0 :(得分:1)
如果使用java?单个文件存在多个符号链接时,如何识别哪个链接修改了目标文件?
这是不可能的。
任何编程语言都无法实现。
操作系统必须支持此功能,并且我没有遇到任何操作系统。
有启发式(使用时间戳)可能会起作用"大部分时间"但是在每种情况下都存在启发式将不给出答案甚至错误答案的情况。以下是一些令人困惑的问题:
使用简单的时间戳启发式方法:
如果其中一个符号链接位于只读文件系统上,或者未记录访问时间的文件系统(例如,取决于挂载选项),
< / LI>
如果在最后一个文件写入后符号链接上发生文件读取,它将无法工作。
添加观察者时:
如果你没有观看&#34;它会工作。当时(呃!)和
如果您有太多的观察者事件,它将无法工作......而且您无法跟上。
(此外,我不认为你可以获得使用符号链接的事件。所以你仍然需要检查符号链接访问时间戳。这意味着只读文件系统等是一个问题也在这里。)
然后有以下情况:
这些可能超出了OP用例的范围。但它们与OP的第一句所述的一般性问题相关。
答案 1 :(得分:0)
也许你可以使用Files.readAttributes()
来做到这一点。以下工作 with Linux ,因为当你在Linux下“使用”符号链接时,它的最后访问时间会被修改。不知道在Windows下,你必须测试。
如果symlink1
是您的第一个符号链接的Path
,symlink2
是Path
到第二个符号链接,realFile
是Path
到Files.readAttributes(symlink1, BasicFileAttributes.class).lastAccessTime();
Files.readAttributes(symlink2, BasicFileAttributes.class).lastAccessTime();
Files.readAttributes(realFile, BasicFileAttributes.class).lastModifiedTime();
您的真实文件,然后您可以使用以下方法检索符号链接的上次访问时间的FileTime
个对象和文件的上次修改时间:
FileTime
由于Comparable
自身为symlink1
,您可能会发现修改了哪个符号链接,但这不是保证。
说明:如果有人使用realFile
修改symlink1
,那么realFile
的访问时间将被修改并且修改时间symlink1
的em>将被修改。如果symlink2
的上次访问时间比symlink1
的上次访问时间长,则有可能 symlink2
用于此操作;另一方面,如果realFile
的上次访问时间且 symlink2
的最后修改时间较短,那么您确定WatchService
是{{1}} 不用于此目的。
但同样没有真正的保证。那些只是启发式的!
您还应该看一下使用{{1}}来观察真实文件的修改;这将使启发式算法更加精确。但同样,不能保证。