2017-11-23 17 views
0

環境:Windowsコンソールアプリケーションがあり、コマンドラインからexeを実行しています。このコードのMicrosoft Outlookにロードすると、Redemption APIを使用して作成されたPSTファイルが空になっています

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を使用しているとは思わないが、どこでもコピーして移動できるからだ。何が問題なのでしょうか?何か提案してください。

UPDATE 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ファイルからすべての電子メールメッセージのファイルパスをロードしています。私はまだ上記と同じ問題に遭遇します。

答えて

0

これはそれをリセットしてPSTファイルを修正し、」PSTストアはディスクおよびOutlookに完全にフラッシュされていないことを示している。

は、明示的にログオフする前に、最初のオブジェクトとGCを呼び出すすべての償還を解放するようにしてください。収集()。あなたは、ループ処理複数のファイルを持っている場合は、ループの各ステップにメッセージをリリース。comオブジェクトは、私がループ内で解放する必要があります

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(); 
} 
+0

を?それはrdo_Mailとフォルダ? –

+0

RDOMailです。フォルダはループのすべての反復で使用されるため、ループを開始する前に取得する必要があり、ループが終了した後に解放する必要があります。だからマルチドットの表記法(RDOFolder.Items.Addなど)を使わないようにしてください。 –

+0

こんにちはドミトリー、私はループを使用して私の実際のコードで私の質問に更新(Update1)を追加しました。私はあなたが言ったことをしましたが、同じ問題を抱えています。コードを確認してください。私はループの前に償還オブジェクトを取り出し、ループの後にリリースしましたが、問題を解決していません。デフォルトのフォルダを削除するために複数のドット表記を使用しているのでしょうか?また、カスタムフォルダも追加する必要があります。電子メールメッセージの論理パスごとにカスタムフォルダを作成する必要があります。これどうやってするの? –

関連する問題