2013-04-08 85 views
0

基本上我必须监视新创建文件的文件夹。识别新创建的文件并对其进行处理

在我的项目,我们有运行,每10分钟之后,我们现在做的是读取所有的文件名,并在数据库中检查其是否已经处理或没有,如果没有,那么处理使DB中的条目和调度处理它。

我GOOGLE了它,发现几个解决方案涉及到像JNotify,FileAlterationObserver类和FileAlterationMonitor的路径,但有大约20个文件夹我必须监视,所以我正在寻找任何简单的解决方案,比如每当我读取文件标记它(重新命名并附加“已处理”至其名称或任何唯一文本),然后下次读取未标记为“已处理”的文件。

采用这种方法,我将不得不读取文件夹中的所有文件,并检查每个文件名是否与“加工”或没有结束。

我是新来的Jave所以我不知道是否有可能或没有,所以我的问题是,我可以查询所有这一切都没有用“加工”结尾的文件名,而无需遍历所有在场的文件名在文件夹中?

或者任何人有任何其他解决方案?

回答

0

如果您可以更改文件名,那么您可以将文件重命名为'old_file_name + Processed',然后仅处理那些名称不以处理结束的文件名。

+0

我可以查询所有这一切都不能以“加工”不遍历所有存在的文件夹中的文件名结尾的文件名? – 2013-04-08 13:22:34

1

一旦处理完成,我们需要该文件了吗?谁在修改文件?如果是通过程序,该程序是否需要关于已处理文件的信息?当该程序要修改文件要重新将其重命名为file1_processedfile1
如果你改变了文件名(尽管我不知道你系统的内外关系,但我觉得它会被修改),你必须考虑这些用例以及更多。
更好的是你我们JNotifier,它使用起来非常简单。使用这个你实际上可以删除调度器。每当某个特定文件(添加/修改等)发出通知时,您可以实际更新数据库的时间仅限特定文件,无需遍历文件夹。
只要确保在少数情况下,您可以在JNotifier(例如,当添加新文件时,您将被添加,修改,重命名后您将被重命名,修改。所以这些东西你必须小心。
有了旧的调度程序,你也可以做同样的事情。您可以将上次更新的文件时间戳保存在数据库中。在下一个计划中,您只需检查最新的时间戳,如果时间戳较新,则处理它并重新更新数据库。
你也可以做JNotify和调度程序的组合。通过jnotify更新一些ADT中更改/修改的文件名,调度程序可以在ADT内部进行搜索,获取修改后的文件路径并仅在数据库中更新这些文件。


您可以从下面的例子帮助,

public void register(String path) throws JNotifyException { 
     int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED 
       | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED; 
     boolean watchSubtree = true; 
     if (pathSet.contains(path)) { 
      return; 
     } 
     System.out.println("Adding watch for: " + path); 
     JNotify.addWatch(path, mask, watchSubtree, 
       new JNotifyListener() { 

        @Override 
        public void fileCreated(int arg0, String folderName, String fileName) { 
         fileChanged("New object created: " + fileName + " in folder: " + folderName); 

        } 

        @Override 
        public void fileDeleted(int arg0, String folderName, String fileName) { 
         fileChanged(fileName + " deleted in folder: " + folderName); 
        } 

        @Override 
        public void fileModified(int arg0, String folderName, String fileName) { 
//      fileChanged(fileName + " modified in folder: " + folderName); 
        } 

        @Override 
        public void fileRenamed(int arg0, String folderName, String oldFileName, 
          String newFileName) { 
         fileChanged(oldFileName + " renamed to: "+ oldFileName +" in folder: " + folderName); 
        } 
       }); 
    } 

    private void fileChanged(String str){ 
     //your code here 
    } 
+1

一旦处理,我们不再需要该文件,我们只需要新创建的文件,所以我不需要修改,删除操作,但我必须监视20这样的路径,所以我应该使用JNotifier,因为如果它由于某种原因失败,那么将是大问题 – 2013-04-09 09:35:52

+0

如果你不需要处理文件,那么你可以简单地将它们移出你的文件夹,并把它们放到某个归档文件夹中。当您的程序在原始文件夹内搜索时,它不会获取这些处理文件,只会获取新文件。有了这个,你不必检查任何条件,如加工或没有等...所以你的程序性能和可维护性会增加。 – 2013-04-10 06:44:51

+0

yup,但将它们移动到另一个文件夹意味着服务器上的一个新文件夹,我不确定我们能做到这一点,因为归档是任何方式自动化控制m作业归档1个月的文件。 – 2013-04-10 07:18:22

相关问题