0

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

在我的项目中,我们有一个每 10 分钟运行一次的调度程序,现在我们要做的是读取所有文件名并检查数据库是否已处理,如果未处理,则在数据库中输入并处理它。

我用谷歌搜索了它,发现很少有解决方案涉及像 JNotify , FileAlterationObserver 类以及 FileAlterationMonitor 这样的路径的listner,但是我必须监视大约20个文件夹,所以我正在寻找任何更简单的解决方案,例如每当我读取文件时将其标记为已处理(重命名它并将“已处理”附加到其名称或任何唯一文本中)并下次读取未标记为“已处理”的文件。

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

我是jave的新手,所以我不知道这是否可能,所以我的问题是,我可以在不遍历文件夹中存在的所有文件名的情况下查询所有不以“已处理”结尾的文件名吗?

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

4

2 回答 2

1

处理完成后,我们还需要该文件吗?谁在修改文件?如果是通过程序,该程序是否需要有关已处理文件的信息?当该程序要修改文件时,将再次将其从file1_processed重命名为file1
如果您更改文件名,您必须考虑这些用例以及更多(虽然我不了解您的系统,但我觉得它会完成)。
最好只有我们JNotifier,使用起来非常简单。使用它,您实际上可以删除调度程序。每当通知针对特定文件(添加/修改等)时,您实际上可以仅针对特定文件更新数据库,无需遍历文件夹。
只需确保在少数情况下您可以收到多个通知JNotifier,例如,当添加新文件时,您会被添加、修改,重命名时您会被重命名、修改。所以这些事情你要小心。
使用旧的调度程序,您也可以这样做。您可以将文件的最后更新时间戳保存在数据库中。在下一个计划中,您只需检查最新的时间戳,如果时间戳较新,则处理它并重新更新数据库。
您也可以混合使用JNotify调度程序。通过 jnotify 更新 some 中更改/修改的文件名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
    }
于 2013-04-08T13:31:32.190 回答
0

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

于 2013-04-08T13:00:56.307 回答