无法移动文件:进程无法访问该文件,因为它正由另一个进程使用

时间:2011-07-13 11:25:41

标签: c# .net outlook outlook-redemption

场景:我编写了一个应用程序来打开.msg文件列表(已经转储到文件系统中),从中获取一些信息(subject,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);

3 个答案:

答案 0 :(得分:2)

完成后尝试拨打util.CleanUp

答案 1 :(得分:1)

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

答案 2 :(得分: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();
    }