そのファイルオープン大丈夫ですか?
ここ数年で次々と新しいプログラミング言語が生まれ、それに伴い開発環境も非常に
使いやすくなりました。ホント、昔と比べてずいぶん簡単になったと思います。 昔はハードやOSよりの言語でしたが、現在は抽象化が進みハードやOSの知識が浅くても 割と簡単にアプリケーションの作成ができるようになりました。 さて、OSの機能の1つであるファイル管理の中に排他制御というものがあります。 これはあるプログラムがファイルを使っている間、他のプログラムからファイル アクセスできないようにする仕組みのことです。 当然ですが、今でもこの仕組みは存在します。 C#ではStreamReaderやStreamWriter、FileStreamを使ってファイル操作します。そのときの排他制御は・・・ ・StreamReaderは「読み込み許可」 ・StreamWriterは「書き込み許可」 ・FileStreamは以下から選ぶことができます。 「読み込み、書き込み許可」 「読み込み許可」 「書き込み許可」 「読み込み、書き込み禁止」 「削除許可」 「子プロセスで継承」 この辺まで言うと、ピンとくる方がいらっしゃると思いますが^^; 排他制御関連でよく見かけるパターン(問題??)を2つほどご紹介します。
1)排他制御の指定を行わずにFileStreamを使う。
排他制御を指定しない場合、直感的に読み書き許可と思ってしまいがちですが、
実はデフォルトは読み書き禁止です。 このことを知らずにいると、たまにファイルオープンに失敗する、なぜだろう? ユーザがエディタ(排他機能ON)でファイルを操作してたのでは?と 実装ミスなのにユーザに疑いをかける事になるかもしれません。オソロシヤ
2)StreamReader 読み込みだけだから大丈夫!
これはStreamReaderとStreamWriterが絡むときに見かけます。
たとえば、プログラムAはログをファイル出力。 プログラムBはファイルを読み込み画面に表示するビューアだったとします。 プログラムAはファイル出力するだけなのでStreamWriterを使用 プログラムBは読み込みだけだからStreamReaderを使用します。 このときログファイルを出力中にStreamReaderでオープンしようとすると例外が 発生します。その逆で、ファイルを読み込み画面へ反映している最中に、 ログファイルを出力しようとしても例外となります。 ビューアのせいでログが出力できない。となったら困りものですね。 サンプルプログラム
|