基本上我必须监视新创建文件的文件夹。
在我的项目中,我们有一个每10分钟运行一次的调度程序,现在我们所做的就是读取所有文件名并检查数据库是否已处理,如果没有处理,则在数据库和进程中创建一个条目它
我用Google搜索并发现很少有涉及列表程序的解决方案,如JNotify,FileAlterationObserver类以及FileAlterationMonitor,但是我必须监视大约20个文件夹,所以我正在寻找任何更简单的解决方案,就像每当我读取文件标记为已处理(重命名并将“已处理”附加到其名称或任何唯一文本),然后下次读取未标记为“已处理”的文件。
使用这种方法,我将不得不从文件夹中读取所有文件并检查每个文件名是否以“已处理”结束。
我是jave的新手,所以我不知道是否可能,所以我的问题是,我可以查询所有不以“已处理”结尾的文件名,而不会迭代所有文件夹中的文件名?
或者有人有其他解决方案吗?
答案 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”,然后只处理那些名称不以处理结束的文件名。