使用Redemption API创建的PST文件在Microsoft Outlook中加载时为空

时间:2017-11-23 10:48:18

标签: c# process outlook outlook-redemption

环境:我有一个Windows控制台应用程序,我从命令行运行exe。 以下是我的代码:

 static void Main(string[] args)
 {
   CreatePSTUsingRedemption(args[0], args[1]);
 }
 private static void CreatePSTUsingRedemption(string messageFilePath, string pstPath)
 {       
   RDOSession pstSession = new RDOSession();
   RDOPstStore store = null;
   store = pstSession.LogonPstStore(pstPath, 1, "combinedPST");
   //actually there is a loop here to loop through each message files.
   RDOMail rdo_Mail = pstSession.GetMessageFromMsgFile(messageFilePath);
   rdo_Mail.CopyTo(store.IPMRootFolder);
   rdo_Mail.Save();
   store.Save();
   completedCount++;
   Console.WriteLine("FILES_PROCESSED:" + completedCount);
   pstSession.Logoff();
 }

此代码的主要目的是创建一个组合电子邮件(.msg)文件的单个pst文件。 现在,当我运行exe时,会在给定位置创建一个pst文件,并且随着代码的运行,它的大小会不断增加。处理完所有消息文件后,应用程序就存在。没有任何错误。现在,当我尝试在Outlook 2013中加载此pst文件时.Pst为空,每次其大小也减少到265KB。我不认为任何进程正在使用此pst,因为我可以将其复制并移动到我想要的任何地方。可能是什么问题?有什么建议吗?

更新1

private static void CreatePSTUsingRedemption(XmlNodeList nodelist, string pstPath)
    {
        System.Diagnostics.Debugger.Launch();
        RDOSession pstSession = null;
        RDOPstStore store = null;
        RDOFolder folder = null;
        RDOMail rdo_Mail = null;
        try
        {
            pstSession = new RDOSession();
            store = pstSession.LogonPstStore(pstPath, 1, Path.GetFileNameWithoutExtension(pstPath));             
            var enumerator = store.IPMRootFolder.Folders.GetEnumerator(); //DELETE DEFAULT FOLDERS
            while (enumerator.MoveNext())
            {
                var defaultFolders = enumerator.Current as RDOFolder;
                    defaultFolders.Delete();
            }
            int completedCount = 0;
            folder = store.IPMRootFolder;
            foreach (XmlNode node in nodelist)
            {
                rdo_Mail = pstSession.GetMessageFromMsgFile(node["FullPath"].InnerText);              
                rdo_Mail.CopyTo(folder);
                rdo_Mail.Save();
                store.Save();
                completedCount++;
                Console.WriteLine("FILES_PROCESSED:" + completedCount);                              
            }            
        }
        finally
        {
            Marshal.ReleaseComObject(rdo_Mail);
            Marshal.ReleaseComObject(folder);
            Marshal.ReleaseComObject(store);
        }
        pstSession.Logoff();
        Marshal.ReleaseComObject(pstSession);
        GC.Collect();
    }

以上是我实际循环的代码。我正在从xml文件加载所有电子邮件文件路径。我仍然遇到与上述相同的问题。

1 个答案:

答案 0 :(得分:0)

这表明PST存储未完全刷新到磁盘,并且Outlook"修复了'重置它的PST文件。

在注销之前尝试显式释放所有Redemption对象并调用GC.Collect()。如果您有循环处理多个文件,请在循环的每个步骤中释放消息。

 private static void CreatePSTUsingRedemption(string messageFilePath, string pstPath)
 {       
   RDOSession pstSession;
   try
   {
     RDOPstStore store;
     RDOFolder folder;
     RDOMail rdo_Mail;
     pstSession = new RDOSession();
     store = pstSession.LogonPstStore(pstPath, 1, "combinedPST");
     //actually there is a loop here to loop through each message files.
     rdo_Mail = pstSession.GetMessageFromMsgFile(messageFilePath);
     folder = store.IPMRootFolder;
     rdo_Mail.CopyTo(folder);
     rdo_Mail.Save();
     store.Save();
     completedCount++;
     Console.WriteLine("FILES_PROCESSED:" + completedCount);
   }
   finally
   {
     Marshal.ReleaseComObject(rdo_Mail);
     Marshal.ReleaseComObject(folder);
     Marshal.ReleaseComObject(store);
   }
   pstSession.Logoff(); 
   Marshal.ReleaseComObject(pstSession);
   GC.Collect();
 }