C# 如何使用 EWS 托管 API 从 PublicFolders 的文件夹和子文件夹中获取所有项目
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13877629/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How To Get all ITEMS from Folders and Sub-folders of PublicFolders Using EWS Managed API
提问by user1891567
How to retrieve all items from "public folders" and its "sub-folders" in exchange server2010 uisng managed API???
如何在 Exchange server2010 使用托管 API 中从“公共文件夹”及其“子文件夹”中检索所有项目???
rootfolder = Folder.Bind(service,WellKnownFolderName.PublicFoldersRoot);
rootfolder.Load();
foreach (Folder folder in rootfolder.FindFolders(new FolderView(int.MaxValue)))
{
FindItemsResults<Item> findResults = folder.FindItems(iv);
foreach (Item item in findResults)
{
//get item info;
}
}
"If i do like this i am not getting items present in sub-folders of it..public folders does not support deep traversal queries too..How can i get items from sub-folders of public folders???"
“如果我这样做,我不会在它的子文件夹中获取项目......公共文件夹也不支持深度遍历查询......我如何从公共文件夹的子文件夹中获取项目???”
回答by Henning Krause
You Need to perform a recursive traversal of the public Folder tree. You cannot perform a deep traversal on public folders.
您需要执行公共文件夹树的递归遍历。您不能对公用文件夹执行深度遍历。
回答by ono2012
To get all folders use the code below:
要获取所有文件夹,请使用以下代码:
public void GetAllFolders(ExchangeService service, List<Folder> completeListOfFolderIds)
{
FolderView folderView = new FolderView(int.MaxValue);
FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, folderView);
foreach (Folder folder in findFolderResults)
{
completeListOfFolderIds.Add(folder);
FindAllSubFolders(service, folder.Id, completeListOfFolderIds);
}
}
private void FindAllSubFolders(ExchangeService service, FolderId parentFolderId, List<Folder> completeListOfFolderIds)
{
//search for sub folders
FolderView folderView = new FolderView(int.MaxValue);
FindFoldersResults foundFolders = service.FindFolders(parentFolderId, folderView);
// Add the list to the growing complete list
completeListOfFolderIds.AddRange(foundFolders);
// Now recurse
foreach (Folder folder in foundFolders)
{
FindAllSubFolders(service, folder.Id, completeListOfFolderIds);
}
}
To get all items:
获取所有物品:
List<Folder> completeListOfFolderIds = new List<Folder>();
//Fills list with all public folders and subfolders
GetAllFolders(service, completeListOfFolderIds);
foreach(Folder folder in completeListOfFolderIds)
{
ItemView itemView = new ItemView(int.MaxValue);
FindItemsResults<Item> searchResults = service.FindItems(folder.Id, itemView);
//do something with item list
}
FYI FindFolders /FindItems only returns first 1000 items, so you'll have to alter this code to overcome that if you have massive structures.
仅供参考 FindFolders /FindItems 仅返回前 1000 个项目,因此如果您有大量结构,则必须更改此代码以克服该问题。
回答by bacca87
public IEnumerable<Item> FindItemsInSubfolders(FolderId root, SearchFilter itemsFilter)
{
foreach (Folder folder in service.FindFolders(root, new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep }))
foreach(Item item in service.FindItems(folder.Id, itemsFilter, new ItemView(int.MaxValue)))
yield return item;
foreach (Item item in service.FindItems(root, itemsFilter, new ItemView(int.MaxValue)))
yield return item;
}
回答by Shivansh
List<Folder> completeListOfFolderIds = new List<Folder>();
GetAllFolders(service, completeListOfFolderIds);
foreach (Folder folder in completeListOfFolderIds)
{
List<Item> results = GetItems(service, folder);
}
public void GetAllFolders(ExchangeService service, List<Folder> completeListOfFolderIds)
{
ExtendedPropertyDefinition isHiddenProp = new ExtendedPropertyDefinition(0x10f4, MapiPropertyType.Boolean);
FolderView folderView = new FolderView(int.MaxValue);
folderView.PropertySet = new PropertySet(isHiddenProp,FolderSchema.DisplayName, FolderSchema.Id, FolderSchema.ChildFolderCount, FolderSchema.TotalCount, FolderSchema.ParentFolderId, FolderSchema.WellKnownFolderName);
List<SearchFilter> searchFilterCollection = new List<SearchFilter>();
searchFilterCollection.Add(new SearchFilter.IsEqualTo(isHiddenProp, false));
SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection.ToArray());
Folder rootfolder = Folder.Bind(service, WellKnownFolderName.MsgFolderRoot);
// Indicate a Traversal value of Deep, so that all subfolders are retrieved.
folderView.Traversal = FolderTraversal.Deep;
rootfolder.Load();
//FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, folderView);
FindFoldersResults findFolderResults = rootfolder.FindFolders(searchFilter, folderView);
foreach (Folder folder in findFolderResults)
{
completeListOfFolderIds.Add(folder);
//List<Item> results = GetItems(service, folder);
FindAllSubFolders(service, folder.Id, completeListOfFolderIds);
}
}
private void FindAllSubFolders(ExchangeService service, FolderId parentFolderId, List<Folder> completeListOfFolderIds)
{
FolderView folderView = new FolderView(int.MaxValue);
FindFoldersResults foundFolders = service.FindFolders(parentFolderId, folderView);
completeListOfFolderIds.AddRange(foundFolders);
// Now recurse
foreach (Folder folder in foundFolders)
{
FindAllSubFolders(service, folder.Id, completeListOfFolderIds);
}
}
private List<Item> GetItems(ExchangeService service ,Folder folder)
{
if (service == null)
{
return null;
}
List<Item> items = new List<Item>();
PropertySet propertySet = new PropertySet(BasePropertySet.FirstClassProperties);
const Int32 pageSize = 50;
ItemView itemView = new ItemView(pageSize);
itemView.PropertySet = propertySet;
FindItemsResults<Item> searchResults = null;
try
{
do
{
searchResults = service.FindItems(folder.Id,itemView);
items.AddRange(searchResults.Items);
itemView.Offset += pageSize;
} while (searchResults.MoreAvailable);
}
catch (Exception ex)
{
}
return items;
}

