使用JNotify库,如何判断被删除的文件是文件还是目录?

3

对于不熟悉 JNotify 的人来说,这是一个库,提供了一种简单的方式来监视目录中的事件。

例如,在选择的文件夹中删除文件时,会调用“fileDeleted”方法,并带有一些参数。这里是“fileDeleted”方法的示例:

public void fileDeleted(int wd, String rootPath, String name) {
   print("deleted " + rootPath + " : " + name);
}

现在,我想知道被删除的文件是文件还是目录。我的常规做法是使用给定路径创建一个新的File对象,并使用isFile()和isDirectory()方法。
但是,由于这个文件已经被删除了,这些方法总是返回false。
所以,这是我的具体问题:我有一个已经删除的文件或目录的路径,如何判断它是文件还是目录?有没有绕过此问题的方法?在这里应该采取什么最佳实践?
提前感谢您。
3个回答

3

我建议使用更好的API,比如Commons IO。它在其接口org.apache.commons.io.monitor.FileAlterationListener和其方法onFile...()onDirectory...()中表现出独特的性能。或者,这可能是最好的方式,使用Java 7提供的新标准功能WatchService,可以在这里进行讨论。


谢谢,我已经研究过了,但显然WatchService不支持RENAMED通知。虽然有第三方库可以添加此功能,但我发现我在使用WatchService时遇到了与JNotify相同的问题(多个通知等)。最终,我决定使用我的服务器来了解删除文件的情况,因为没有简单的客户端解决方案。无论如何,还是谢谢! :) - Moeri

2

你要查看的目录结构有多大?

我的第一反应是使用一些简单的图遍历算法来构建目录结构的内部表示,然后在每次删除时进行查找以确定它是什么。

<edit>
如果您知道您的目录结构是一个严格的树形结构,您可以使用简单的递归来遍历文件系统,并创建一个FileStringboolean的映射,以便您可以进行简单的查找。然后,一旦构建了地图,使用JNotify事件维护它应该很容易。
<edit/>

即使对于中等大小的目录,我认为这也可以变得非常快。这是做什么的?可能有另一种实现相同目标的方法吗?


根据目录中的内容,您可能只需要一个简单的递归算法(即,如果没有使目录不成为树形结构的快捷方式),并且您的文件/目录可以存储在映射中,而不是构建图形,将位置映射到布尔值isDirectory。为什么不想询问服务器呢?如果服务器已经跟踪文件,它不能只查看自己的状态吗? - Dogmatixed
嗨,只是给你一个更新:我决定从服务器端查看文件或目录,因为客户端并不真正需要知道这一点。因为在客户端进行解决问题的方法会有些繁琐。我不会将您的答案标记为已接受,因为我不想让那些偶然发现此线程的人感到困惑,而且显然我不能为您投票,因为我没有足够的声望...所以我只能说谢谢您花费时间! :) - Moeri
没问题,我认为Robert Petermeier的答案可能更好。希望这个项目顺利! - Dogmatixed

0

我也遇到了同样的问题。但据我所知,Java的WatchService不允许监视子目录,因此我无法使用它(任务是监视包含约40K个文件夹的结构的更改)。我将尝试使用简单(但容易出错)的启发式方法:

如果它包含一个点(“.”),那么它就是一个文件。

如果我找到更复杂的解决方案,我会发布更新...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接