1

シナリオ:.msgファイル(ファイルシステムにダンプされている)のリストを開き、それらからいくつかの情報(subject、To CC)を取得して、それらを移動するアプリケーションを作成しました。

問題:ただし、ファイルの移動に関しては、次のエラーが発生します。

別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。

ファイルに対してHandleを実行すると、私が作成したツールのみが表示され、他のハンドルは表示されません。

したがって、Redemption MessageItemオブジェクトとしての使用を終了したときに、ファイルを適切に解放していないと思います。

ただし、IDisposableを実装していないため、usingステートメントでラップすることはできません。また、パブリックのCloseやDispose、または同様の名前のメソッドは公開されません。



要するに、私は尋ねようとしています:

a)ファイルハンドルへのパスのみを知っている状態で、c#アプリケーションに特定のハンドルを強制的に閉じるにはどうすればよいですか?

または

b)償還オブジェクトを強制的に閉じる方法はありますか?

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 に答える