- ベストアンサー
C#です。教えて下さい!!
C#でプログラミングしています。 今、あるデータをsampleというまだ何も書いていないテキストファイルに書き込みをしています。 それは、 StreamWriter writer = new StreamWriter("E:\\sample\\sample.txt"); とかいています。 そして、sampleに書かれたデータをさらにsample_recordという配列に入れています。 実行すると成功するのですが、何度か実行すると 「別のプロセスで使用されているため、プロセスはファイル 'E:\sample\sample.txt' にアクセスできません。」 というエラーがでます。これはなぜですか? 何度も実行できるようにしたいので、教えて下さい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
通常,ファイルへ書き込む場合は他の場所 (自プロセス/他プロセス,自スレッド/他スレッド問わず) で開いていない状態でないといけません。 例えば, using (StreamWriter sw1 = new StreamWriter(@"E:\sample\sample.txt")) using (StreamWriter sw2 = new StreamWriter(@"E:\sample\sample.txt")) { } なんて書くだけでも,sw2で例外が発生します。 恐らく,開いたファイルをちゃんと閉じていないのだと思います。 その結果,たまたまGCが発生した場合はファイナライザでファイルが閉じられていたためにエラーにはならなかったが, GCが発生しなかった場合にはファイルが閉じられていないために例外が発生したのでしょう。 ・ファイルを使わなくなったら必ず閉じる (StreamWriter.Close()を呼び出す。usingを併用しておくと安全) ・同一のファイルを開きっぱなしにしておくなら,二度開かないようにする といった対処をする必要があります。
その他の回答 (1)
- tanma3
- ベストアンサー率58% (14/24)
>「別のプロセスで使用されているため、プロセスはファイル 'E:\sample\sample.txt' にアクセスできません。」というエラーがでます。 上記はStreamWriterクラスがスレッドセーフではないからです。 たぶんsample.txtを解放していないのに、違うスレッドがsample.txtにアクセスしようとしているので上記エラーが発生するのでしょうね。 なので、エラーを出さない為には、スレッドセーフにする必要があります。 スレッドセーフラッパー実装については参考URLを参考にして下さい。
お礼
アドバイスありがとうございます!!
お礼
アドバイスありがとうございます!!