我写了一个Java程序,它监视目录的变化。我保留了一个文件列表(String []),每隔x秒我就得到一个新列表并比较它们以查找添加了哪些文件以及删除了哪些文件。
问题在于,如果我重命名文件,它将显示为删除具有旧名称的文件,然后添加具有新名称的文件。
如何跟踪名称变化?
编辑:我想找到一个Java 6的解决方案。 代码:public void run() {
int ok;
while(true) {
// verify if modified from last check
if(modified != file.lastModified()) {
Date d = new Date();
list = file.list();
// look for new files
for(String x : list) {
ok = 0;
for(String y : old) {
if(x.equals(y)) {
ok = 1;
}
}
if(ok == 0) {
display.setText(display.getText() + "Created file " + x + " at " + d.toString() + "\n");
}
}
// looking for old files
for(String x : old) {
ok = 0;
for(String y : list) {
if(x.equals(y)) {
ok = 1;
}
}
if(ok == 0) {
display.setText(display.getText() + "Deleted file " + x + " at " + d.toString() + "\n");
}
}
}
old = file.list();
modified = file.lastModified();
try {
Thread.sleep(f * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
此外,在此代码中,如果我想写old = list(保留最后一个列表),我会在NullPointerException
行获得for(String y : old)
。为什么呢?
答案 0 :(得分:1)
我认为没有办法做到便携,可靠和高效。
阅读文件内容很昂贵且可能不可靠。 (例如,如果您有两个具有相同内容的文件,它将会中断。
依赖文件时间戳可能不可靠。 (您可以使用具有相同时间戳的不同文件。)
我不认为WatchService
可以检测在目录中重命名的文件。 (它可以检测重命名或重命名,但不是这种情况......根据this javadoc。)
这样做的可靠而有效的方法(至少在Linux系统上)是使用本机Linux监视服务(支持更多FS事件),或者使用inode编号和本机文件创建的组合时间戳。但这些都涉及使用本机代码进行相关的系统调用。