0

次のコードを使用して、Outlookからすべてのフォルダーを取得します。

 public void getFolderPath()
    {
        try
        {
            OutLook.Application oApp = new OutLook.Application();
            OutLook.NameSpace oNS = (OutLook.NameSpace)oApp.GetNamespace("MAPI");
            oNS.Logon(Missing.Value, Missing.Value, false, true);

            foreach (MAPIFolder folder in oNS.Folders)
            {
                GetFolders(folder);
            }

            Marshal.ReleaseComObject(oApp);


        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

これにより、OutLookにリストされているように、すべてのフォルダーが上から下に表示されます。サイズの昇順で表示したり、通過したりする方法はありますか。

似たようなもの:

foreach (MAPIFolder folder in oNS.Folders.sortbysize())
        {
            GetFolders(folder);
        }
4

1 に答える 1

0

いいえ、Outlookのフォルダコレクションは並べ替えることができません。
拡張MAPi(C ++またはDelphiのみ)または償還(任意の言語)を使用した場合でも、PR_MESSAGE_SIZEプロパティでのフォルダーの並べ替えは機能しません。PSTプロバイダーはそれを公開せず、Exchangeはすべてのフォルダーに対して0を返す傾向があります。
PR_CONTENT_COUNTプロパティ(フォルダ内のメッセージの数)で並べ替えることはできますが、サイズで並べ替えることはできません。次のスクリプト(Outlook VBA)は、償還を使用してフォルダーをPR_CONTENT_COUNTで並べ替えます。

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT 
set Folders = Session.Stores.DefaultStore.IPMRootFolder.Folders
Folders.MAPITable.Sort "http://schemas.microsoft.com/mapi/proptag/0x36020003", true
for each Folder in Folders
  Debug.print Folder.Name & " (" & Folder.Fields("http://schemas.microsoft.com/mapi/proptag/0x36020003") & ")"
next 

さらに高速なバージョン(子フォルダーを開かず、ExecSQLメソッドを使用)は次のようになります。

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT 
set Folders = Session.Stores.DefaultStore.IPMRootFolder.Folders
set MAPITable = Folders.MAPITable
MAPITable.Sort "http://schemas.microsoft.com/mapi/proptag/0x36020003", true
set Recordset = MAPITable.ExecSQL("SELECT ""http://schemas.microsoft.com/mapi/proptag/0x3001001E"" AS PR_DISPLAY_NAME, " & _
                                  " ""http://schemas.microsoft.com/mapi/proptag/0x36020003"" AS PR_CONTENT_COUNT " & _
                                  " from Table")
while not Recordset.EOF
    Debug.Print Recordset.Fields("PR_DISPLAY_NAME").Value & " (" & Recordset.Fields("PR_CONTENT_COUNT").Value & ")"
    Recordset.MoveNext
wend
于 2013-02-14T16:39:49.970 に答える