2011-07-13 10 views
1

シナリオ:ファイルシステムにダンプされた.msgファイルのリストを開くアプリケーションを作成しました。そこからいくつかの情報(件名、To CC)を入力して移動します。ファイルを移動できません:プロセスが別のプロセスで使用されているため、ファイルにアクセスできません。

問題:それはファイルの移動に来るときしかし、私は次のエラーを取得する:

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

は、ファイルに対するハンドルを実行するだけで、私が書いたツールなし他のハンドルを示します。

私はRedemption MessageItemオブジェクトとして使用し終えると、ファイルを適切にリリースしないと思います。

しかし、IDisposableを実装していないため、usingステートメントでそれらを囲むことはできません。そして彼らは公開されたクローズやディスポーザー、あるいは同様の名前のメソッドを公開していません。要するに



は、私が尋ねるしようとしている:

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); 
+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のfinally文に入れてください。 – 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(); 
    } 
関連する問題