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



环境:我有一个Windows Console应用程序,我正在从命令行中运行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文件加载所有电子邮件文件路径。我仍然遇到与上述相同的问题。

这表明PST商店未完全冲洗到磁盘和Outlook"通过重置它来修复'PST文件。

尝试在登录之前先明确释放所有赎回对象,然后致电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();
 }

最新更新