3

ファイルに情報を書き込んで、プログラムの複数のコピーを実行すると、次のエラーが発生します。

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

コードは次のとおりです。

// create a writer and open the file
TextWriter tw2 = File.AppendText(@"C:\logs\log.txt");

// write a line of text to the file
tw2.WriteLine(Environment.NewLine);
tw2.WriteLine(DateTime.Now + " " + "IN INFOSERVCALLER");
tw2.Flush();

正しい方法でそれを行う方法は?

4

4 に答える 4

1

この種のコードは常にusingステートメントにカプセル化してください

using(TextWriter tw2 = File.AppendText(@"C:\logs\log.txt"))
{
    tw2.WriteLine(Environment.NewLine); 
    tw2.WriteLine(DateTime.Now + " " + "IN INFOSERVCALLER"); 
    //tw2.Flush();  // No need to flush because close alway flush.
}

このusingステートメントは、ブロックの最後でtw2.Close()を呼び出します。
また、ブロック内で例外が発生した場合。

これで、アプリケーションの他のインスタンスが何らかの理由で失敗した場合、ファイルはロックされなくなります

于 2012-04-18T13:30:59.483 に答える
1

Mutexクラスを使用して、複数のプロセスからのログファイルへのアクセスを同期します。書き込みが完了したら、ファイルを開く前にWaitOneを呼び出し、ファイルを閉じた後にReleaseMutexを呼び出します(フラッシュだけでは不十分です。ファイルを閉じるか、キーワードを使用してラップする必要があります)。ミューテックス名はプレフィックス「Global」で始まる必要があります。

于 2012-04-18T14:10:59.253 に答える
0

フラッシングとは別にClose()、ファイルを作成する必要があります。

さらに、別のインスタンスが同時にファイルを書き込んでいる場合、(他のプログラムがを呼び出すまで)そのファイルにアクセスすることはできませんClose()

TextWriter.Closeメソッド

ライターの現在のインスタンスを閉じ、ライターに関連付けられているシステムリソースを解放します

この場合、「システムリソース」とは、ファイルを閉じるまでロックされたままになるファイルを指します。

于 2012-04-18T13:23:39.897 に答える
0

テキストライターでファイルを開くたびに閉じる必要があります。

したがって、各操作の後に使用します

// create a writer and open the file
TextWriter tw2 = File.AppendText(@"C:\logs\log.txt");

// write a line of text to the file
tw2.WriteLine(Environment.NewLine);
tw2.WriteLine(DateTime.Now + " " + "IN INFOSERVCALLER");
tw2.Flush();
tw2.Close(); 

その後、もう一度書き込みを試みても、それ以上問題は発生しません。

于 2012-04-18T13:25:14.117 に答える