• ベストアンサー

C#です。教えて下さい!!

C#でプログラミングしています。 今、あるデータをsampleというまだ何も書いていないテキストファイルに書き込みをしています。 それは、 StreamWriter writer = new StreamWriter("E:\\sample\\sample.txt"); とかいています。 そして、sampleに書かれたデータをさらにsample_recordという配列に入れています。 実行すると成功するのですが、何度か実行すると 「別のプロセスで使用されているため、プロセスはファイル 'E:\sample\sample.txt' にアクセスできません。」 というエラーがでます。これはなぜですか? 何度も実行できるようにしたいので、教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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を併用しておくと安全) ・同一のファイルを開きっぱなしにしておくなら,二度開かないようにする といった対処をする必要があります。

noname#46927
質問者

お礼

アドバイスありがとうございます!!

その他の回答 (1)

  • tanma3
  • ベストアンサー率58% (14/24)
回答No.1

>「別のプロセスで使用されているため、プロセスはファイル 'E:\sample\sample.txt' にアクセスできません。」というエラーがでます。 上記はStreamWriterクラスがスレッドセーフではないからです。 たぶんsample.txtを解放していないのに、違うスレッドがsample.txtにアクセスしようとしているので上記エラーが発生するのでしょうね。 なので、エラーを出さない為には、スレッドセーフにする必要があります。 スレッドセーフラッパー実装については参考URLを参考にして下さい。

参考URL:
http://msdn2.microsoft.com/ja-jp/library/system.io.streamwriter(VS.80).aspx
noname#46927
質問者

お礼

アドバイスありがとうございます!!

関連するQ&A