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

Java 如何在Lotus Notes中查找文件夹(视图)的所有子文件夹,java,lotus-notes,lotus-domino,lotus,Java,Lotus Notes,Lotus Domino,Lotus,我正在使用LotusNotes/Domino的JavaAPI。我需要将Lotus文档放在auf Lotus文件夹(视图)中,这些文件夹像文件系统中的文件夹一样组织 要查找并选择创建文件夹,我使用以下代码。路径字符串使用反斜杠分隔符(即“TestFolder/SubFolder1/SubSubFolder1”)。文件夹按预期创建并显示在notes客户端中 View view = database.getView(path); if (view == null) { db.enableFol

我正在使用LotusNotes/Domino的JavaAPI。我需要将Lotus文档放在auf Lotus文件夹(视图)中,这些文件夹像文件系统中的文件夹一样组织

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

View view = database.getView(path);
if (view == null) {
    db.enableFolder(path);
    view = db.getView(path);
}
如何查找特定文件夹的所有子文件夹

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

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);
            }
        }
    }
}
List result=new ArrayList();
字符串前缀=getPath()+getSeparator();
对于(对象obj:database.getViews()){
视图=(视图)obj;
if(view.isFolder()){
字符串路径=view.getName();
if(路径开始带(前缀)){
字符串后缀=path.substring(prefix.length());
if(后缀.indexOf(getSeparator())=-1){
结果。添加(视图);
}
}
}
}

不幸的是,没有真正快速的方法可以做到这一点。如果您真的需要性能,那么让它变得更快的唯一方法就是使用NoteCollection-类并获取所有文件夹。然后运行表示文件夹的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倍-方法。

不幸的是,没有真正快速的方法可以做到这一点。如果您确实需要性能,那么让它变得更快的唯一方法是使用NoteCollection-类并获取所有文件夹。然后运行表示文件夹的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倍。

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

使用NoteCollection进行此操作效率较低,因为它扫描数据库中的所有笔记,包括所有文档,而database.getViews使用design collection快速将其缩小为仅查看笔记


过去,仅仅为了查看视图对象是否是您感兴趣的视图而访问视图对象的属性效率很低,因为它会更新视图索引。但在最新版本的Notes中,情况已不再如此。无论您有多少视图,浏览GetView返回的集合都会获得良好的性能。

中的代码操作很好,只是分隔符始终为“\”——它不依赖于操作系统,因此不需要调用getSeparator。您可能还希望使用不区分大小写的文件夹名比较,以防万一

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);
            }
        }
    }
}
使用NoteCollection进行此操作效率较低,因为它扫描数据库中的所有笔记,包括所有文档,而database.getViews使用design collection快速将其缩小为仅查看笔记


过去,仅仅为了查看视图对象是否是您感兴趣的视图而访问视图对象的属性效率很低,因为它会更新视图索引。但在最新版本的Notes中,情况已不再如此。无论有多少视图,浏览GetView返回的集合都会获得良好的性能。

子文件夹是可用的不是真正的子文件夹。它实际上只是一个带有命名约定的平面结构,创建了子文件夹的错觉,因此您的编码方式是合适的。子文件夹不是真正的子文件夹。它实际上只是一个带有命名约定的平面结构,创建了子文件夹的错觉,因此您的编码方式是合适的。我gree使用NoteCollection要好得多,但这里有几个问题。首先,您可以使用SelectionFormula属性查找名称与您的条件匹配的文件夹。这样,您就不用在扫描结果时打开每个便笺,从而提高了速度。其次,此代码会错误地调用“Georgia”“Geo”的子文件夹。您希望名称以“Geo\”开头,而不仅仅是“Geo”。注意:当您使用selectionformula时,请小心用额外的\转义特殊字符\和“(双引号)。您正在搜索的文件夹名称可能包含“.@AndreGuirard您如何设置SelectionFormula以仅返回带有特定前缀的文件夹?我同意使用NoteCollection更好,但这里有几个问题。首先,您可以使用SelectionFormula属性查找名称与您的条件匹配的文件夹。这样您就不用在创建时打开每个便笺扫描您的结果,让您更快。其次,此代码会错误地将“Georgia”称为“Geo”的子文件夹。您可能希望名称以“Geo\”开头,而不仅仅是“Geo”。注意:当您使用selectionformula时,请小心用额外的\转义特殊字符\和“(双引号)。您正在搜索的文件夹名称可能包含“.@AndreGuirard您如何将SelectionFormula设置为仅返回带有特定前缀的文件夹?
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);
            }
        }
    }
}