如何在Lotus Notes中查找文件夹(View)的所有子文件夹

时间:2014-03-26 11:50:44

标签: java lotus-notes lotus-domino lotus

我正在使用Lotus Notes / Domino的Java-API。我需要将Lotus-Documents放在auf Lotus-Folders(Views)中,它们像文件系统中的文件夹一样组织。

要查找并选择创建文件夹,我使用以下代码。 path-String使用反斜杠分隔符(即“TestFolder / SubFolder1 / SubSubFolder1”。文件夹按预期创建并显示在Notes客户端中。

View view = database.getView(path);
if (view == null) {
    db.enableFolder(path);
    view = db.getView(path);
}

如何找到特定文件夹的所有子文件夹?

现在我正在使用此解决方法。 Imho这不是很好,因为我总是阅读所有目录。当结构变大时,这可能会对性能产生影响。

List<View> result = new ArrayList<View>();
String prefix = getPath() + getSeparator();
for (Object obj : database.getViews()) {
    View view = (View)obj;
    if (view.isFolder()) {
        String path = view.getName();
        if (path.startsWith(prefix)) {
            String suffix = path.substring(prefix.length());
            if (suffix.indexOf(getSeparator()) == -1) {
                result.add(view);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:4)

不幸的是,没有真正快速的方法。如果你真的需要性能,那么使它快得多的唯一方法就是使用NoteCollection-Class并获取所有文件夹。然后运行表示文件夹的NotesDocuments并读取“$ Title”项。以下是执行此操作的示例代码:

NoteCollection nc = database.createNoteCollection(false);
nc.setSelectFolders(true);
nc.buildCollection();
String id = nc.getFirstNoteID();
while (id.length() > 0) {
  String strFolderName = ""
  Document docFolder = database.getDocumentByID(strFolderId);
  strFolderName = docFolder.getItemValueString("$Title");
  if (strFolderName.startsWith(prefix)) {
     ....
  }
}

在我的测试中,这比使用getViews() - 方法快2-3倍。

答案 1 :(得分:0)

OP中的代码很好,除了分隔符总是“\” - 它不依赖于操作系统,所以不需要getSeparator调用。您可能还希望使用不区分大小写的文件夹名称比较,以防万一。

为此使用NoteCollection效率较低,因为它会扫描数据库中的所有注释,包括所有文档,而database.getViews使用设计集合将其快速缩小到仅查看注释。

以前访问View对象的属性只是为了查看它是否是您感兴趣的视图,因为它会更新视图索引。但在Notes的最新版本中,情况已不再如此。无论您有多少视图,通过getViews返回的集合进行浏览都可以获得良好的性能。