使用RDOFolder对象降低性能

时间:2017-07-06 13:41:00

标签: com jscript outlook-redemption

我正在开发一个修改Outlook文件夹的实用程序脚本。为此,我通过COM接口(Windows Script Host / JScript)使用Redemption v5.14。

我有这两个函数可以为RDOFolder的所有子文件夹提供一些信息:

// enumerate all subfolders of an RDOFolder
function getFolderList(rdoFolder) {
    if (!rdoFolder) return;

    return foldersToArray(rdoFolder.Folders).map(getFolderDetails);
}

// pull out some details about a single RDOFolder
function getFolderDetails(rdoFolder) {
    if (!rdoFolder) return;

    return {
        name: rdoFolder.Name,
        entryID: rdoFolder.EntryID,
        defaultMessageClass: rdoFolder.DefaultMessageClass,
        folderCount: rdoFolder.Folders.Count
    };
}

foldersToArray()只是将Folders集合枚举到JS数组中。

这需要花费大量时间来处理更大的子文件夹列表 - 对于40个子文件夹,大约需要12秒。

当我将最后一个函数减少到检索较少信息的东西时:

// pull out some details about a single RDOFolder
function getFolderDetails(rdoFolder) {
    if (!rdoFolder) return;

    return {
        folderCount: rdoFolder.Folders.Count
    };
}

然后性能良好(40个子文件夹需要几十毫秒)。

但不知何故,即使访问RDOFolder的Name属性(或任何其他属性)也会增加非常的开销。

为什么会发生这种情况,有没有办法改善它?

1 个答案:

答案 0 :(得分:1)

RDOFolder使用延迟初始化 - 访问任何属性强制Redemption通过调用IMAPISession::OpenEntry来初始化RDOFolder。要避免打开基础MAPI文件夹,可以使用ExecSQL(RDOFolder.Folders.MAPITable.ExecSQL)来检索PR_DISPLAY_NAME_W, PR_ENTRYID, PR_CONTAINER_CLASS_W, PR_SUBFOLDERS属性 - 请参阅http://www.dimastr.com/redemption/mapitable.htm#ExecSQL