识别新创建的文件并进行处理

时间:2013-04-08 12:51:56

标签: java

基本上我必须监视新创建文件的文件夹。

在我的项目中,我们有一个每10分钟运行一次的调度程序,现在我们所做的就是读取所有文件名并检查数据库是否已处理,如果没有处理,则在数据库和进程中创建一个条目它

我用Google搜索并发现很少有涉及列表程序的解决方案,如JNotify,FileAlterationObserver类以及FileAlterationMonitor,但是我必须监视大约20个文件夹,所以我正在寻找任何更简单的解决方案,就像每当我读取文件标记为已处理(重命名并将“已处理”附加到其名称或任何唯一文本),然后下次读取未标记为“已处理”的文件。

使用这种方法,我将不得不从文件夹中读取所有文件并检查每个文件名是否以“已处理”结束。

我是jave的新手,所以我不知道是否可能,所以我的问题是,我可以查询所有不以“已处理”结尾的文件名,而不会迭代所有文件夹中的文件名?

或者有人有其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

一旦处理完毕,我们是否还需要该文件?谁在修改文件?如果是通过程序,该程序是否需要有关已处理文件的信息?当要修改文件的程序要再次从 file1_processed 重命名为 file1 时?
如果你改变文件名,你必须考虑这些用例以及更多用例(虽然我不知道你的系统,但我觉得它会被收集)。
更好的是你我们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 :(得分:0)

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