符号链接中的修改

时间:2014-04-03 10:47:35

标签: java file symlink

如果使用Java为单个文件存在多个符号链接时,如何识别哪个链接修改了目标文件?我无法找到修改目标文件的文件。

示例:D:\sample.txt,D:\folder1\sample.txt;这两个是链接。目标文件位于E:\sample.txt

现在如何确定D:\sample.txtD:\folder1\sample.txt是否修改了E:\sample.txt

2 个答案:

答案 0 :(得分:1)

  

如果使用java?单个文件存在多个符号链接时,如何识别哪个链接修改了目标文件?

这是不可能的。

任何编程语言都无法实现。

操作系统必须支持此功能,并且我没有遇到任何操作系统。


有启发式(使用时间戳)可能会起作用"大部分时间"但是在每种情况下都存在启发式将不给出答案甚至错误答案的情况。以下是一些令人困惑的问题:

使用简单的时间戳启发式方法:

  • 如果其中一个符号链接位于只读文件系统上,或者未记录访问时间的文件系统(例如,取决于挂载选项),

  • < / LI>
  • 如果在最后一个文件写入后符号链接上发生文件读取,它将无法工作。

添加观察者时:

  • 如果你没有观看&#34;它会工作。当时(呃!)和

  • 如果您有太多的观察者事件,它将无法工作......而且您无法跟上。

(此外,我不认为你可以获得使用符号链接的事件。所以你仍然需要检查符号链接访问时间戳。这意味着只读文件系统等是一个问题也在这里。)

然后有以下情况:

  • 两个符号链接用于编写文件
  • 您不了解所有符号链接,或
  • 用于写作的符号链接已被删除或触及&#34;。

这些可能超出了OP用例的范围。但它们与OP的第一句所述的一般性问题相关。

答案 1 :(得分:0)

也许你可以使用Files.readAttributes()来做到这一点。以下工作 with Linux ,因为当你在Linux下“使用”符号链接时,它的最后访问时间会被修改。不知道在Windows下,你必须测试。

如果symlink1是您的第一个符号链接的Pathsymlink2Path到第二个符号链接,realFilePathFiles.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}}来观察真实文件的修改;这将使启发式算法更加精确。但同样,不能保证。