我正在尝试迭代文件夹的子文件夹和子文件夹。例如。收件箱有五个子文件夹,所以我正在尝试迭代全部五个子文件箱。但是我只能迭代第一个子文件夹。
Outlook.MAPIFolder inboxFolder =
ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
Outlook.Stores stores = ns.Stores;
foreach(Store store in stores)
{
Outlook.MAPIFolder inbox_folder =
store.GetDefaultFolder(outlook.olDefaultFolders.olFolderInbox);
foreach(Outlook.MailItem item in Inbox_folder.items)
{
//code for attachment
}
}
当我想迭代子文件夹的子文件夹时,它仅返回文件夹的第一个子文件夹。我想迭代文件夹的n个子文件夹。
处理文件夹的代码必须递归调用
foreach(Store store in stores)
{
Outlook.MAPIFolder inbox_folder =
store.GetDefaultFolder(outlook.olDefaultFolders.olFolderInbox);
ProcessFolder(inbox_folder);
}
...
private void ProcessFolder(MAPIFolder folder)
{
//subfolders
foreach(MAPIFolder subFolder in folder.Folders)
{
ProcessFolder(subFolder);
}
//items
foreach (Object item in folder.Items)
{
}
}
正如Dmitry所指出的,您需要使用递归才能枚举所有文件夹。在《枚举文件夹》文章中阅读有关此信息的更多信息。例如:
private void EnumerateFoldersInDefaultStore()
{
Outlook.Folder root =
Application.Session.
DefaultStore.GetRootFolder() as Outlook.Folder;
EnumerateFolders(root);
}
// Uses recursion to enumerate Outlook subfolders.
private void EnumerateFolders(Outlook.Folder folder)
{
Outlook.Folders childFolders = folder.Folders;
if (childFolders.Count > 0)
{
foreach (Outlook.Folder childFolder in childFolders)
{
// Write the folder path.
Debug.WriteLine(childFolder.FolderPath);
// Call EnumerateFolders using childFolder.
EnumerateFolders(childFolder);
}
}
}
尽管Microsoft在其示例代码中显示foreach
循环,但这不是枚举文件夹的最佳方法。我建议改用for
循环。因此,您将能够立即释放基础COM对象。例如,foreach
循环中使用的Fodlers
属性返回相应类的新实例增加参考计数器。
使用System.Runtime.InterOpservices.Marshal.ReleaseComobject在使用它完成后以释放Outlook对象。如果您的加载项尝试在Microsoft Exchange Server上存储的收藏集中的256多个Outlook项目,这一点尤其重要。如果您不及时释放这些对象,则可以在任何时候以最大打开的物品数量交换来达到限制。然后在Visual Basic(C#中的null(中为Nothing
设置一个变量,以发布对对象的引用。在系统发行的对象文章中阅读有关此信息的更多信息。