兑换无法将项目添加到文件夹
Redemption Cannot add Item to Folder
我正在用 C# 编写一个程序,使用 Redemption 遍历 RDOPstStore 中的 RDOMail 对象并复制标记为与新 RDOPstStore 相关。我可以修改RDOPstStore.IPMRootFolder中的文件夹,这样做只留下一个文件夹(结果)。但是,当我将 RDOMail 项目添加到此文件夹(之前保存在列表中)时,这些项目不会出现在文件夹 Items 成员中。为了确保 "added" RDOMail 对象保存在 RDOPstStore 对象中,我是否遗漏了什么?这是代码
//create an output session
RDOSession outputSession = new RDOSession(@"Redemption.RDOSession");
//logon/create output store
outputStore = outputSession.LogonPstStore(outputDir + '\' + filename);
//clear the output store of any folders, we will leave only one: Results
foreach (RDOFolder folder in outputStore.IPMRootFolder.Folders)
{
folder.Delete(); //successful
}
RDOFolder resultsFolder = outputStore.IPMRootFolder.Folders.Add("Results");
foreach(RDOMail mail in relevantItems) //relevantItems gathered previously
{
resultsFolder.Items.Add(mail); //unsuccessful
resultsFolder.Save();
}
/******************EDIT 5/26****************/
outputStore.Save();
outputSession.Logoff();
/******************END EDIT*****************/
非常感谢大家的帮助!
首先,LogonPstStore returns RDOPstStore 对象的实例 - 没有理由从 Stores 集合中检索它或再次添加它。
outputStore = outputSession.LogonPstStore(outputDir + '\' + filename);
其次,PST 提供程序稍后或在会话关闭时提交对 PST 文件的更改。您的应用程序是否正常终止?你打电话给RDOSession.Logoff吗?
好的,所以我能够发现问题。 @Dmitry Streblechenko 是对的,我在登录 Pst Store 后不需要添加新的 PST Store(必要时会创建一个新文件)。
但真正的问题在于将文件复制到新创建的 PST 存储区。问题是使用 RDOFolder.Items.Add(RDOMail)
函数。尽管此 Add()
函数很直观,但正确(或至少有效)的方法可能是使用 RDOMail.CopyTo(RDOMail/RDOFolder)
函数。如此...
mail.CopyTo(resultsFolder);
这成功地将 RDOMail 对象放入 RDOFolder 对象,而 Add() 函数却没有。作为旁注,我阅读了另一个 post @Dmitry 的帮助,他提到 Add()
函数用于创建新项目,因此它可能并非完全无用。虽然看起来可以创建一个新的 RDOMail 对象,修改它,然后使用它的 CopyTo()
函数...
吸取教训。
等一下,您没有保存您添加的消息 - 您在 文件夹 而不是返回的 项目 上调用了保存通过 Items.Add:
RDOMail item = resultsFolder.Items.Add(mail);
item.Save();
我正在用 C# 编写一个程序,使用 Redemption 遍历 RDOPstStore 中的 RDOMail 对象并复制标记为与新 RDOPstStore 相关。我可以修改RDOPstStore.IPMRootFolder中的文件夹,这样做只留下一个文件夹(结果)。但是,当我将 RDOMail 项目添加到此文件夹(之前保存在列表中)时,这些项目不会出现在文件夹 Items 成员中。为了确保 "added" RDOMail 对象保存在 RDOPstStore 对象中,我是否遗漏了什么?这是代码
//create an output session
RDOSession outputSession = new RDOSession(@"Redemption.RDOSession");
//logon/create output store
outputStore = outputSession.LogonPstStore(outputDir + '\' + filename);
//clear the output store of any folders, we will leave only one: Results
foreach (RDOFolder folder in outputStore.IPMRootFolder.Folders)
{
folder.Delete(); //successful
}
RDOFolder resultsFolder = outputStore.IPMRootFolder.Folders.Add("Results");
foreach(RDOMail mail in relevantItems) //relevantItems gathered previously
{
resultsFolder.Items.Add(mail); //unsuccessful
resultsFolder.Save();
}
/******************EDIT 5/26****************/
outputStore.Save();
outputSession.Logoff();
/******************END EDIT*****************/
非常感谢大家的帮助!
首先,LogonPstStore returns RDOPstStore 对象的实例 - 没有理由从 Stores 集合中检索它或再次添加它。
outputStore = outputSession.LogonPstStore(outputDir + '\' + filename);
其次,PST 提供程序稍后或在会话关闭时提交对 PST 文件的更改。您的应用程序是否正常终止?你打电话给RDOSession.Logoff吗?
好的,所以我能够发现问题。 @Dmitry Streblechenko 是对的,我在登录 Pst Store 后不需要添加新的 PST Store(必要时会创建一个新文件)。
但真正的问题在于将文件复制到新创建的 PST 存储区。问题是使用 RDOFolder.Items.Add(RDOMail)
函数。尽管此 Add()
函数很直观,但正确(或至少有效)的方法可能是使用 RDOMail.CopyTo(RDOMail/RDOFolder)
函数。如此...
mail.CopyTo(resultsFolder);
这成功地将 RDOMail 对象放入 RDOFolder 对象,而 Add() 函数却没有。作为旁注,我阅读了另一个 post @Dmitry 的帮助,他提到 Add()
函数用于创建新项目,因此它可能并非完全无用。虽然看起来可以创建一个新的 RDOMail 对象,修改它,然后使用它的 CopyTo()
函数...
吸取教训。
等一下,您没有保存您添加的消息 - 您在 文件夹 而不是返回的 项目 上调用了保存通过 Items.Add:
RDOMail item = resultsFolder.Items.Add(mail);
item.Save();