我正在使用 Java7 的新功能来监视目录的更改(如以下教程中所述:http://download.oracle.com/javase/tutorial/essential/io/notification.html )
观看本身(几乎)没有问题。
或多或少我有两个问题,我希望你们中的一些人知道如何处理它。
添加监视文件夹后,虚拟机可以访问该文件夹,但不会释放该文件夹。这不应该是一个大问题。但是,如果您要在另一个目录中创建一个目录,并在这个目录中再创建一个目录。 (例如,您在目录中创建c:\tmp\a
目录b
and in b
目录c
(c:\tmp\a\b\c
)) 无法删除该目录a
,因为VM的访问b
and c
。如果您想删除所有文件夹(例如,使用 Windows 资源管理器),您必须删除c
首先,然后b
进而a
。很奇怪,但是这种方式可行(虽然不方便)
这个问题似乎是第一个问题的结果。
如果有很多变化a
有时(或多或少)发生我得到一个异常,它告诉我,新创建的文件夹被另一个进程使用,并且无法访问它。这很奇怪,因为我认为收到通知应该不重要。因为尚不完全清楚这个异常到底是什么时候抛出的。
您是否知道如何使没有锁成为可能,或者至少让用户能够以经典的方便方式删除这样的目录结构?
好吧,我已经尝试过您发布的链接中显示的代码,执行与您尝试执行的操作相同的操作:
在我的 c:\temp 目录中,我以编程方式创建一个 c:\temp\a 目录,然后创建一个 c:\temp\a\b 目录:
File startDir = new File("c:\temp");
if(!startDir.exists()) {
startDir.mkdir();
}
File aDir = new File("c:\\temp\\a");
File bDir = new File("c:\\temp\\a\\b");
if(!aDir.exists()) {
aDir.mkdir();
}
if(!bDir.exists()) {
bDir.mkdir();
}
然后我将观察者添加到“a”和“b”目录中:
public static void watch(final File dir,final WatchService watcher) {
Path path = dir.toPath();
try {
final WatchKey bDirWatchKey = path.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
new Thread(new Runnable() {
public void run() {
System.out.println("Watching: "+dir.getName());
while(true) {
try {Thread.sleep(1000);} catch (InterruptedException e) {}
List<WatchEvent<?>> events = bDirWatchKey.pollEvents();
for(WatchEvent<?> event:events) {
System.out.println(dir.getName()+" event: #"+event.count()+","+event.kind()+" File="+event.context());
}
}
}
}).start();
} catch (IOException x) {
x.printStackTrace();
}
}
这工作正常,如果我修改“a”或“b”中的文件,我会得到相应的控制台输出。
确实,使用 Windows 资源管理器(在 Windowx XP 计算机上)我无法删除监视的目录(它告诉我没有访问权限)。不过,我可以使用 Total Commander 等其他工具删除它。我什至可以从 Windows 命令行中删除 thenrd c:\temp\a\b
。我认为这更多是 Windows 资源管理器的问题,而不是 Java 的问题......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)