【问题标题】:How to find a file that's been moved/renamed in Java如何查找已在 Java 中移动/重命名的文件
【发布时间】:2015-05-01 02:59:00
【问题描述】:

我想对在文件移动/重命名后仍然存在的文件有某种文件句柄。这不一定是平台无关的,如果它只适用于Java7 + linux就可以了,如果可以假设文件不会更改目录,那就更好了。

用例是我想编写一个类似于 logstash-file-input 的日志拖尾输入源,即我可以运行来拖尾文件的工具,即使该文件被旋转(即移动/重命名) ) 当我的尾随应用程序关闭时,我希望能够在尾随应用程序再次启动时找到该文件。

我查看了 BasicFileAttributes.fileKey,但没有找到从 fileKey 到 File/Path 对象的任何方法。

有谁知道这是否可以做到?

最好的问候 /托马斯

【问题讨论】:

  • 我不是 Linux 专家,但也许您可以在文件系统中创建一个指向日志文件的硬链接,然后将其尾随而不是实际文件?
  • 您可以使用WatchService 来实现这一点
  • @Philipp。是的,这可能是一种方式,我已经看到了类似问题的答案。不过这似乎有点麻烦,可能与为此编写一些 JNI 模块相当。

标签: java nio log-rotation


【解决方案1】:

这是一个简单的演示,设置 WatchService 并等待事件:

Path dir = Paths.get( "/home", "me", "experiments" );
WatchService watcher =  dir.getFileSystem().newWatchService();
dir.register( watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY );
WatchKey key = watcher.take();
for (WatchEvent<?> event: key.pollEvents()) {
    System.out.println( event.kind().name() + " " + event.context() );
}

如果在./experiments 中执行mv xyz.dat abc.dat,而该程序正在等待take() 调用,则会创建一个包含这些事件的WatchKey:

ENTRY_DELETE zyx.dat
ENTRY_CREATE xyz.dat

上下文是从目录到更改元素的相对路径。

稍后 可以通过确定文件的设备和 inode 来在 Linux 上注册文件的“身份”,也许还可以添加大小和创建日期。然后,您可以在重新获得控制权后搜索此文件,假设它是同一目录。

Path dir = Paths.get( "/home", "wlaun", "Java_Experiments" );
Path file = dir.resolve( "a.log" );
Object fileKey = Files.getAttribute( file, "fileKey" );
Object creaTime = Files.getAttribute( file, "creationTime" );
System.out.println( fileKey.toString() + creaTime.toString() );

我应该补充一点,1.8.0_20 似乎混淆了 creationTime 和 lastAccessTime。

【讨论】:

  • 最好使用Path 本身获取WatchServicedir.getFileSystem().newWatchService()
  • 啊,是的 - 不保证有正确的文件系统。谢谢,已修改。
  • 这仅在我的拖尾应用程序在重命名/移动发生时运行或我遗漏了什么时才有效?如果我的 java 应用程序在旋转发生时没有运行,我正在寻求一种方法来检测这一点。
  • @ThomasLarssonKron 那么你怎么知道要跟踪什么文件呢?除非您至少有要观察的文件名模式等,否则无法做到这一点
  • @fge 考虑我的拖尾应用程序首先运行并拖尾日志文件 A,不断将其当前在 A 中的位置写入其他簿记文件。然后拖尾应用程序崩溃。当它没有运行时,日志应用程序将日志文件 A 旋转到 A.1 并创建一个新的日志文件 A 来记录。当我再次启动拖尾应用程序时,我希望它发现日志文件 A 现在是日志文件 A.1,它应该立即消耗该文件中在拖尾应用程序关闭时写入的所有其余数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多