2017-11-23 23 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 파일. 명시 적으로 모든 구속 로그 오프하기 전에 먼저 개체를 해제하고 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)를 추가했습니다. 나는 네가 한 말을했지만 여전히 같은 문제가있다. 코드를 확인해 주시겠습니까? 루프 이전에 회수 대상을 검색하고 루프 이후에 릴리스했지만 문제를 수정하지 않았습니다. 다중 도트 표기법을 사용하여 기본 폴더를 삭제할 예정입니까? 아니면 사용자 지정 폴더도 추가해야합니다. 이메일 메시지 논리 경로에 따라 세관 폴더를 만들어야합니다. 어떻게해야합니까? –