簡體   English   中英

如何使用Exchange Web Services 2010托管API獲取文件夾大小?

[英]How do I get folder size with Exchange Web Services 2010 Managed API?

我正在嘗試使用EWS 2010托管API來獲取用戶郵箱的總大小。 我還沒有找到一個Web服務方法來獲取這些數據,所以我想我會嘗試計算它。 我在另一個網站上發現了一個關於使用EWS 2007查找郵箱大小的看似適用的問題,但要么我不理解它要求我做什么,要么該方法不適用於EWS 2010。

在代碼洞察中,我能夠編寫我認為是一種遞歸遍歷文件夾結構的方法,並導致收件箱內所有文件夾的總計:

private int traverseChildFoldersForSize(Folder f)
{
    int folderSizeSum = 0;
    if (f.ChildFolderCount > 0)
    {
        foreach (Folder c in f.FindFolders(new FolderView(10000)))
        {
            folderSizeSum += traverseChildFoldersForSize(c);
        }
    }

    folderSizeSum += (int)f.ManagedFolderInformation.FolderSize;

    return folderSizeSum;
}

(假設給定文件夾中的文件夾不超過10,000個。這是一個安全的賭注...)

不幸的是,這不起作用。

我正在用這段代碼啟動遞歸:

Folder root = Folder.Bind(svc, WellKnownFolderName.Inbox);
int totalSize = traverseChildFoldersForSize(root);

但拋出了Null Reference Exception,實質上是說[folder].ManagedFolderInformation是一個空對象引用。

為清楚起見,我還試圖獲得根文件夾的大小:

Console.Write(root.ManagedFolderInformation.FolderSize.ToString());

其中引發了相同的NRE異常,所以我知道一旦你在目錄樹中達到某個深度,ManagedFolderInformation就不存在了。

有關如何獲取用戶郵箱總大小的任何想法? 我吠叫錯了樹嗎?

使用EWS Managad APi,您可以使用此代碼獲取郵箱的累積文件夾大小:

internal class Program
{
    private static readonly ExtendedPropertyDefinition PidTagMessageSizeExtended = new ExtendedPropertyDefinition(0xe08,
                                                                                                                  MapiPropertyType
                                                                                                                    .Long);

    public static void Main(string[] args)
    {
        var service = new ExchangeService(ExchangeVersion.Exchange2010_SP1)
                      {Credentials = new NetworkCredential("mail", "pw!")};

        service.AutodiscoverUrl("mail", url => true);

        var offset = 0;
        const int pagesize = 12;
        long size = 0;

        FindFoldersResults folders;
        do
        {
            folders = service.FindFolders(WellKnownFolderName.MsgFolderRoot,
                                          new FolderView(pagesize, offset, OffsetBasePoint.Beginning)
                                          {
                                            Traversal = FolderTraversal.Deep,
                                            PropertySet =
                                                new PropertySet(BasePropertySet.IdOnly, PidTagMessageSizeExtended,
                                                                FolderSchema.DisplayName)
                                          });
            foreach (var folder in folders)
            {
                long folderSize;
                if (folder.TryGetProperty(PidTagMessageSizeExtended, out folderSize))
                {
                    Console.Out.WriteLine("{0}: {1:00.00} MB", folder.DisplayName, folderSize/1048576);
                    size += folderSize;
                }
            }
            offset += pagesize;
        } while (folders.MoreAvailable);
        Console.Out.WriteLine("size = {0:0.00} MB", size/1048576);
    }
}

第一個鏈接是你想要的方式。 該帖子描述了默認文件夾不被視為“托管文件夾”,這就是您在某些文件夾的ManagedFolderInformation屬性上獲取NRE的原因。

帖子建議的是在文件夾請求中添加擴展屬性。 以下是有關如何使用Managed API執行此操作的MSDN頁面

我試圖找到一個很好的例子,但沒有想出一個。 這應該指向正確的方向。 如果我找到任何東西,我會更新我的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM