1

我编写了一个 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 (保留最后一个列表),我会得到一个NullPointerExceptionat line for(String y : old)。为什么?

4

1 回答 1

1

我认为没有一种既便携、可靠又高效的方法。

  • 读取文件内容的成本很高,而且可能不可靠。(例如,如果您有两个内容相同的文件,它将中断。

  • 依赖文件时间戳可能是不可靠的。(您可以拥有具有相同时间戳的不同文件。)

  • 我不认为 aWatchService可以检测到在目录中重命名的文件。(它可以检测到重命名或重命名,但不是这种情况......根据这个 javadoc。)

  • 可靠且有效的方法(至少在 Linux 系统上)是使用本机 Linux 监视服务(支持更多 FS 事件),或者结合使用 inode 编号和本机文件创建时间戳。但这些都涉及使用本机代码进行相关的系统调用。

于 2013-06-12T16:24:32.857 回答