【问题标题】:How do I get folder size with Exchange Web Services 2010 Managed API?如何使用 Exchange Web Services 2010 托管 API 获取文件夹大小?
【发布时间】:2011-02-03 20:19:50
【问题描述】:

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

但是抛出了一个空引用异常,本质上说[folder].ManagedFolderInformation是一个空对象引用。

为了清楚起见,我还尝试获取根文件夹的大小:

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

这引发了相同的 NRE 异常,所以我知道,一旦您在目录树中达到一定深度,ManagedFolderInformation 不存在。

关于如何获取用户邮箱的总大小的任何想法?我是不是找错树了?

【问题讨论】:

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


    【解决方案1】:

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

    帖子的建议是将扩展属性添加到文件夹请求中。 Here's the MSDN page 了解如何使用托管 API 做到这一点。

    我试图找到一个很好的例子,但没有想出一个。这应该为您指明正确的方向。如果我发现任何东西,我会更新我的答案。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你拯救了我的一天,但你的字节格式并不完美,使用这个:static double ConvertBytesToMb(long bytes) { return (bytes / 1024f) / 1024f; }
      猜你喜欢
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多