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

时间:2010-04-02 19:12:08

标签: c# .net exchange-server exchangewebservices ews-managed-api

我正在尝试使用EWS 2010托管API来获取用户邮箱的总大小。我还没有找到一个Web服务方法来获取这些数据,所以我想我会尝试计算它。我在另一个网站上发现了一个关于finding mailbox sizes with 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就不存在了。

有关如何获取用户邮箱总大小的任何想法?我吠叫错了树吗?

2 个答案:

答案 0 :(得分:9)

使用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);
    }
}

答案 1 :(得分:1)

第一个链接是您想要的方式。该帖子描述了默认文件夹不被视为“托管文件夹”,这就是您在某些文件夹的ManagedFolderInformation属性上获取NRE的原因。

帖子的建议是将扩展属性添加到文件夹的请求中。 Here's the MSDN page关于如何使用托管API执行此操作。

我试图找到一个很好的例子,但没有想出一个。这应该指向正确的方向。如果我发现了什么,我会更新我的答案。