2011-07-13 179 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(); 
    } 
相关问题