通过提供其PATH名称来搜索公用文件夹中的文件夹

use*_*567 4 c# api exchange-server web-services managed

是否可以通过使用Exchange Web服务(EWS)托管Api提供文件夹的路径来搜索公用文件夹中的所有文件夹和文件夹?

ono*_*012 10

您只能在EWS上的一个级别的文件夹中进行搜索,以便:

PublicFoldersRoot\subjectA\sectionB\PARTC \

我会搜索"subjectA"文件夹,然后一旦我有了FolderId,然后我会搜索"sectionB"文件夹,依此类推,直到找到我需要的东西.

该方法GetPublicFolderByPath采用路径"subjectA\sectonB\partC \"并将路径拆分为文件夹名称数组,然后递归查找每个文件夹.

public Folder GetPublicFolderByPath(ExchangeService service, String ewsFolderPath)
{
    String[] folders = ewsFolderPath.Split('\');

    Folder parentFolderId = null;
    Folder actualFolder = null;

    for (int i = 0; i < folders.Count(); i++)
    {
        if (0 == i)
        {
            parentFolderId = GetTopLevelFolder(service, folders[i]);// for first first loop public folder root is the parent
            actualFolder = parentFolderId; //in case folders[] is only one long
        }
        else
        {
            actualFolder = GetFolder(service, parentFolderId.Id, folders[i]);
            parentFolderId = actualFolder;
        }
    }
    return actualFolder;
}
Run Code Online (Sandbox Code Playgroud)

该方法GetTopLevelFolder获取第一个文件夹"sectionA",它是公用文件夹root的子项"WellKnownFolderName.PublicFoldersRoot".

private Folder GetTopLevelFolder(ExchangeService service, String folderName)
    {
        FolderView folderView = new FolderView(int.MaxValue);
        FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, folderView);

        foreach (Folder folder in findFolderResults)
        {
            if (folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase))
            {
                return folder;
            }
        }
        throw new Exception("Top Level Folder not found: " + folderName);
    }
Run Code Online (Sandbox Code Playgroud)

该GetFolder方法采用父FolderId并搜索所有子文件夹以查找名称提供的匹配项,并返回您请求的子FolderId.

private Folder GetFolder(ExchangeService service, FolderId ParentFolderId, String folderName)
    {
        FolderView folderView = new FolderView(int.MaxValue);
        FindFoldersResults findFolderResults = service.FindFolders(ParentFolderId, folderView);

        foreach (Folder folder in findFolderResults)
        {
            if (folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase))
            {
                return folder;
            }
        }

        throw new Exception("Folder not found: " + folderName);

    }
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是Microsoft.Exchange.WebServices托管API dll,类似的想法https://yourexchangeserver/ews/services.wsdl.要从路径获取文件夹,请使用createService对象然后编写:
GetPublicFolderByPath(service, "subjectA\sectionB\partC\")

如果这对你有帮助,请向上投票:)