Java 检查文件名是否已更改
我编写了一个Java程序,它监视目录的变化。我保存了一个文件列表(字符串[]),每x秒我就会得到一个新的列表,并对它们进行比较,找出哪些文件被添加,哪些文件被删除 问题是,如果我重命名一个文件,它将显示为删除一个旧名称的文件,然后添加一个新名称的文件 我可以做些什么来跟踪名称更改 编辑:我想为Java6找到一个解决方案。 代码:Java 检查文件名是否已更改,java,file,Java,File,我编写了一个Java程序,它监视目录的变化。我保存了一个文件列表(字符串[]),每x秒我就会得到一个新的列表,并对它们进行比较,找出哪些文件被添加,哪些文件被删除 问题是,如果我重命名一个文件,它将显示为删除一个旧名称的文件,然后添加一个新名称的文件 我可以做些什么来跟踪名称更改 编辑:我想为Java6找到一个解决方案。 代码: 另外,在这段代码中,如果我想写old=list(保留最后一个列表),我会在(字符串y:old)的行中得到一个NullPointerException。为什么?我不认为有
另外,在这段代码中,如果我想写old=list(保留最后一个列表),我会在(字符串y:old)的
行中得到一个NullPointerException
。为什么?我不认为有一种既便携、可靠又高效的方法可以做到这一点
- 读取文件内容的成本很高,而且可能不可靠。(例如,如果您有两个具有相同内容的文件,它将中断
- 依赖文件时间戳可能是不可靠的。(您可能有具有相同时间戳的不同文件。)
- 我不认为
WatchService
可以检测到在目录中重命名的文件。(它可以检测到重命名入或重命名出,但在这种情况下不能……根据。)
- 可靠而有效的方法(至少在Linux系统上)是使用本机Linux watch服务(支持更多FS事件),或者结合使用inode编号和本机文件创建时间戳。但这两者都涉及使用本机代码进行相关的系统调用
我认为没有一种既便携、可靠又高效的方法可以做到这一点
- 读取文件内容的成本很高,而且可能不可靠。(例如,如果有两个文件具有相同的内容,则会导致中断。)
- 依赖文件时间戳可能是不可靠的。(您可能有具有相同时间戳的不同文件。)
- 我不认为
WatchService
可以检测到在目录中重命名的文件。(它可以检测到重命名入或重命名出,但在这种情况下不能……根据。)
- 可靠而有效的方法(至少在Linux系统上)是使用本机Linux watch服务(支持更多FS事件),或者结合使用inode编号和本机文件创建时间戳。但这两者都涉及使用本机代码进行相关的系统调用
您是否有代码要共享,所以我们知道您目前是如何完成这项工作的?您是基于文件名的吗?您可以在文件系统中使用id而不是名称之类的东西…这样,即使文件被重命名,其id也不会更改…根据文件的数量,您可以对文件进行CRC o MD5并保持签入g根据这些散列,这样您就可以确定文件是否被删除。您是否有代码共享,这样我们就知道您目前是如何完成这项工作的?您是否基于文件的名称?您可以在文件系统中使用id之类的东西,而不是名称…这样,即使文件被重命名,其id也不会更改…取决于amm您可以将文件的CRC设置为MD5,并不断检查这些哈希值,以便确定文件是否已删除。
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();
}
}
}