1

场景:我编写了一个应用程序来打开 .msg 文件列表(已转储到文件系统),从中获取一些信息(主题,To CC),然后移动它们。

问题:但是,在移动文件时,我收到以下错误:

该进程无法访问该文件,因为它正被另一个进程使用。

对文件运行句柄只显示我编写的工具,没有其他句柄。

因此,我假设当我使用完这些文件作为 Redemption MessageItem 对象后,我没有正确地释放它们。

但是我不能将它们包装在 using 语句中,因为它们没有实现 IDisposable。而且它们不公开任何公开的 Close 或 Dispose 或类似名称的方法。



简而言之,我想问:

a) 如何强制我的 c# 应用程序关闭给定的句柄,只知道文件句柄的路径?

或者

b) 有没有办法强制 Redemption 对象关闭?

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);
4

3 回答 3

2

完成后尝试调用util.CleanUp

于 2011-07-13T11:46:23.853 回答
1

不要使用 MAPIUtils.GetItemFromMsgFile - 它已被弃用。使用 RDOSession.GetMessageFromMsgFile(或 CreateMessageFromMsgFile)——它返回支持 IDisposable 的 IRDOMail 对象。

于 2011-07-13T14:29:21.630 回答
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();
    }
于 2011-07-13T13:41:51.750 回答