2013-06-12 149 views
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(); 
     } 
    } 
} 

而且,在这段代码,如果我想要写旧=列表(保留最近列表),我在线for(String y : old)处获得NullPointerException。为什么?

+0

你有分享的代码,所以我们知道你目前是如何完成这个的? –

+0

你是基于文件名吗?而不是名称,可能是你可以在文件系统中使用id排序的东西...即使一个文件重命名它的id不会改变... http://stackoverflow.com/questions/8289598/ file-id-for-keeping-track-of-file-changes-in-java – pinkpanther

+1

根据文件数量的不同,你可以对文件的MD5和MD5进行检查,并持续检查这些哈希值,以便确定如果文件被删除或没有。 – Averroes

回答

1

我不认为有一种方法可以做到便携,可靠和高效。

  • 读取文件内容很昂贵并且可能不可靠。 (例如,它会如果你有相同内容的两个文件打破。

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

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

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