エラーが発生しています:
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;
締め切りがあるので、この問題の解決策を探しています。私のアイデアのいくつかは次のとおりです。
- ファイルを開いたままにします。試運転中は開閉しないでください。
- ファイルをポーリングしている間、ユーザーに「ファイルを待っています」というメッセージを表示します (いつ再び開くことができるかを確認するため)。
- ファイル I/O を処理するアンマネージ C または C++ ライブラリを作成します (アンマネージ C および C++ は .NET フレームワークを使用しないため)。
- 急いでファイルを閉じるように .NET フレームワークに指示する方法を学習します。
Windows 7、64 ビット アーキテクチャで MS Visual C# 2008 Express を使用しています。