2011-07-13 103 views
1

場景:我編寫了一個應用程序來打開.msg文件列表(已轉儲到文件系統),抓取從他們的一些信息(主題,到CC),然後移動它們。無法移動文件:進程無法訪問該文件,因爲它正在被另一個進程使用

問題:然而,當涉及到移動我得到以下錯誤文件:

The process cannot access the file because it is being used by another process.

運行處理有關文件只顯示我寫的工具,並沒有其他的手柄。

因此,我假設我在完成將它們用作Redemption MessageItem對象時沒有正確地釋放這些文件。

但是我無法將它們包裝在using語句中,因爲它們沒有實現IDisposable。而且他們不公開任何公開的關閉或處置或類似命名的方法。



總之,我試圖問:

一)我怎麼能強迫我的C#應用​​程序關閉一個給定的手柄,只知道路徑文件句柄?

或者

二)有沒有辦法來強制贖回對象關閉?

var util = new MAPIUtilsClass(); 

MessageItem item = util.GetItemFromMsgFile(EmailPath, false); 

item.Import(EmailPath, 3); 

Subject = item.Subject; 

From = (item.SenderName.Length < 96) ? item.SenderName : item.SenderName.Substring(0, 93) + "..."; 

To = (String.IsNullOrEmpty(item.To)) ? String.Empty : (item.To.Length < 96) ? item.To : item.To.Substring(0, 93) + "..."; 

CC = (String.IsNullOrEmpty(item.CC)) ? String.Empty : (item.CC.Length < 96) ? item.CC : item.CC.Substring(0, 93) + "..."; 

Sent = item.SentOn; 

Received = item.ReceivedTime; 

Log.Write("Redemption: Email data harvested" + EmailPath); 
+5

沒有代碼,你覺得我們可以幫你嗎?! –

+0

剛剛添加的代碼 – Richard

+0

MAPIUtilsClass類是否實現IDisposable?如果是這樣,將該吸盤包裝在一個使用中,並應該照顧你的問題。 –

回答

1

不要使用MAPIUtils.GetItemFromMsgFile - 它已經過時了。 使用RDOSession.GetMessageFromMsgFile(或CreateMessageFromMsgFile) - 它返回支持IDisposable的IRDOMail對象。

+0

我發現的RDOSession對象的問題是它需要你連接到Exchange,我可能沒有憑據.. – Richard

+0

不,GetMessageFromMsgFile不除非您訪問需要它的屬性,例如RDOMail.Sender,否則需要一個活動的MAPI會話。 RDOMail.SenderEmailAddress等沒有問題,因爲它們直接從消息中讀取。 –

+1

也許我使用的是舊版本,但是我看不到實現IDisposable的IRDOMail? – christiandev

2

嘗試在完成後致電util.CleanUp

+0

感謝您的建議,但我仍然得到錯誤... – Richard

+1

+1 - 它現在的作品立即調用GC.Collect( )然後把它放在try-catch的最後聲明 – Richard

0

按照Daniel的建議使用Util.CleanUp()方法,但立即用GC.Collect()成功並將其放在try-catch的finally語句中。

因此,代碼現在看起來像這樣:

MAPIUtilsClass util = null; 

    try 
    { 

     util = new MAPIUtilsClass(); 

     MessageItem item = util.GetItemFromMsgFile(EmailPath, false); 

     item.Import(EmailPath, 3); 

     Subject = item.Subject; 

     From = (item.SenderName.Length < 96) ? item.SenderName : item.SenderName.Substring(0, 93) + "..."; 

     To = (String.IsNullOrEmpty(item.To)) ? String.Empty : (item.To.Length < 96) ? item.To : item.To.Substring(0, 93) + "..."; 

     CC = (String.IsNullOrEmpty(item.CC)) ? String.Empty : (item.CC.Length < 96) ? item.CC : item.CC.Substring(0, 93) + "..."; 

     Sent = item.SentOn; 

     Received = item.ReceivedTime; 

     util.Cleanup(); 

     Log.Write("Redemption: Email data harvested: " + EmailPath); 


    } 
    catch (Exception exp) 
    { 
     Log.Write(String.Format("Error using Redemption API against: {0}\r\n{1}\r\n{2}", 
      this.EmailPath, exp.Message, exp.StackTrace)); 
    } 

    finally 
    { 
     if (util != null) 
      util.Cleanup(); 

     GC.Collect(); 
    } 
相關問題