2017-07-06 114 views
0

我正在研究修改Outlook文件夾的實用程序腳本。爲此,我通過COM接口(Windows Script Host/JScript)使用Redemption v5.14。RDOFolder對象性能低下

我有這兩個功能是讓我的一些信息的數組的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子文件夾)。

但不知何故,甚至訪問Name屬性(或任何其他)的RDOFolder會增加非常的開銷。

爲什麼會發生這種情況,有沒有辦法改善它?

回答

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

+0

好的,這個工作起來,速度也很快。謝謝!我唯一不明白的就是這個給我的EntryID的格式。這與我從RDOFolder的'EntryID'屬性獲得的不同,'RDOStore.GetFolderFromID()'似乎並不喜歡它。 – Tomalak

+0

請求'PR_LONGTERM_ENTRYID_FROM_TABLE'(DASL'「http://schemas.microsoft.com/mapi/proptag/0x66700102'')獲得正確的值。再次感謝。 – Tomalak