1

エラーが発生しています:

The process cannot access the file 
'C:\AMR_VOYANT_TESTING\PWM_TESTER\UUT_LOGS\TEST_LOG_PWM_10245_UUT_SN_10.TXT'
because it is being used by another process.

私のプログラムは、ログ ファイルをフラッシュし、閉じて、破棄します。私のプログラムは後でファイルを開いてさらにデータを追加しようとします。この 2 回目の開始により、上記の例外が発生します。

Process Explorer実行中に、バイナリ ファイルに直接アクセスするか、MS Visual C# Express 2008 を使用してデバッグ モードで実行すると、ファイルのハンドルが表示されません。

このファイルはアプリケーションによって作成された元のファイルであるため、 他のプロセスがこのファイルを使用することはありません

スタック オーバーフローの解決策の中には、usingステートメントの実装を提案するものがありますが、データの書き込みが単純または短い複合ステートメントで行われないため、これは実行できません。ライター デリゲートは、ログ クラスによってデータをファイルに書き込むために使用されます。

Stack Overflow の他のソリューションによると、forループ内で、ファイルが開かれる次の繰り返しの前にファイルが閉じられない場合があります。ファイルを再度開く前に10秒以上待っていましたが、役に立ちませんでした(同じ例外)。

コードのサンプルを次に示します。

    public void
    close()
    {
        get_log_file().WriteLine("");
        get_log_file().Flush();
        get_log_file().Close();
        get_log_file().Dispose();
        m_log_file = null;
        return;
    }


    private StreamWriter
    get_log_file()
    {
        if (m_log_file == null)
        {
            bool successful = false;
            int retries_remaining = 5;
//                do
//                {
//                    try
//                    {            
//                        m_log_file = new StreamWriter(m_filename, true);
                m_log_file = new StreamWriter(new FileStream(m_filename, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));
//                    }
//                    catch (IOException)
//                    {

//                        --retries_remaining;
//                        System.Threading.Thread.Sleep(250); // Units are in milliseconds;
//                    }
//                } while (!successful && (retries_remaining >= 0));
            }
            return m_log_file;
        }
        private System.IO.StreamWriter m_log_file = null;
        private string m_filename;

締め切りがあるので、この問題の解決策を探しています。私のアイデアのいくつかは次のとおりです。

  1. ファイルを開いたままにします。試運転中は開閉しないでください。
  2. ファイルをポーリングしている間、ユーザーに「ファイルを待っています」というメッセージを表示します (いつ再び開くことができるかを確認するため)。
  3. ファイル I/O を処理するアンマネージ C または C++ ライブラリを作成します (アンマネージ C および C++ は .NET フレームワークを使用しないため)。
  4. 急いでファイルを閉じるように .NET フレームワークに指示する方法を学習します。

Windows 7、64 ビット アーキテクチャで MS Visual C# 2008 Express を使用しています。

4

4 に答える 4

0
  1. 正しくやりたいのなら、ある程度の時間を費やさなければなりません。または
  2. トレースまたはロギングフレームワークを使用します。
  3. Visual Studio Hosting Process でデバッグしていると思います。無効にして、ファイルのロックの問題が解決するかどうかを確認してください。

のチェックボックスを無効にします

Project - Properties - Debug - x Enable Visual Studio hosting process

StreaWriter が既に閉じられているアプリケーションのシャットダウン中に、ファイナライザーの 1 つでトレースしている可能性もあります。Critical Finalizerを使用することでこれを回避できます

さようなら、アロイス・クラウス

于 2011-05-02T20:58:15.863 に答える
0

ファイルを開いたままにしておくことで、この問題を解決しました。これにより、毎回ファイルを再度開く必要がなくなりました。

于 2011-05-04T17:49:19.300 に答える
0

このクラスのメソッドを呼び出しているコードは、open メソッドを呼び出した後に close() メソッドを呼び出していません。あなたが投稿したコードに基づいて、別の open メソッドがあると思います。そのメソッドが複数回呼び出されると、説明している例外が発生します。投稿したコードには、発生している例外を引き起こす問題はありません。Close() を呼び出す前に Flush() を呼び出すと、ディスクへの書き込みが強制されるため、Close() を呼び出すときに遅延が発生しません。この問題がありました。

更新: デバッグ中にコードが例外をスローした場合、VS はそのファイルのハンドルをまだ開いています。コードを修正しても、引き続きその例外がスローされます。私は通常、VS を閉じて再起動し、プロジェクトの設定を台無しにして、誤ってソース管理にチェックインしないようにしています。

于 2011-05-03T04:30:00.530 に答える
0

私があなたに迅速な解決策を提供したいと思っているのはFileMode.OpenorCreateFileMode.Append;に置き換えることです。

他の人が指摘しているように、他にも無数のロギングオプションがありますが、これにより、前進するために後退するのではなく、現在の場所から迅速に前進できると思います.

あなたのコードは、ストリームライターを呼び出し元のコンテキストに返すクラスのフラグメントであるように見えます。クラスに IDisposable を実装させて Dispose に近いものに変更し (IDisposable を実装するため)、消費者に呼び出しを using(yourLogClass logger = new yourLogClass())... などにラップさせて、close が確実に呼び出されるようにします。使用するたびに。

于 2011-05-02T21:04:16.233 に答える