トップ回答者
ファイルアクセスのエラー

質問
-
下記のように記述すると、2行目で「ファイルにアクセス出来ません」と言うエラーになります。
1行目で FileShare.ReadWrite を指定しているのになぜアクセス出来ないのでしょうか。FileStream WriteFile = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
FileStream ReadFile = new FileStream(FileName, FileMode.Open, FileAccess.Read);
回答
-
こんにちは、ファクトです。
FileStreamのFileShare引数指定無し版コンストラクタは、ヘルプを読むところによると
FileShare パラメータを指定しないタイプの FileStream コンストラクタに対しては、FileShare.Read が既定値です。
という事なので、ReadFileを開く際のFileStreamコンストラクタが、「誰かがReadするのは許すけど、誰かがWriteするのは許さない」という指定になり、例外が発生したのではないかと思います。
なので、ReadFileを開く際のコンストラクタに、FileShare.ReadWriteかFileShare.Writeを指定すれば、とりあえず例外は出なくなります。
-
直接のエラー原因はファクトさんが既に述べられている通りです。
実際に実験したところ、ReadFile側のコンストラクタにFileShare.ReadWriteを加えることで例外が起きなくなります。
気がかりな点として、同時に別々のインスタンス変数でファイルを開くとなんだか混乱するのではないかと思います。
ReadFileで現在位置が進んだ後に、WriteFile側でSetLengthでサイズ変更したりとか…。
ファイルを作成し、ファイルに書き込み、閉じない内にファイルを読みたいのであれば、FileAccess.ReadWriteは検討してみてはいかがでしょうか?
すべての返信
-
こんにちは、ファクトです。
FileStreamのFileShare引数指定無し版コンストラクタは、ヘルプを読むところによると
FileShare パラメータを指定しないタイプの FileStream コンストラクタに対しては、FileShare.Read が既定値です。
という事なので、ReadFileを開く際のFileStreamコンストラクタが、「誰かがReadするのは許すけど、誰かがWriteするのは許さない」という指定になり、例外が発生したのではないかと思います。
なので、ReadFileを開く際のコンストラクタに、FileShare.ReadWriteかFileShare.Writeを指定すれば、とりあえず例外は出なくなります。
-
直接のエラー原因はファクトさんが既に述べられている通りです。
実際に実験したところ、ReadFile側のコンストラクタにFileShare.ReadWriteを加えることで例外が起きなくなります。
気がかりな点として、同時に別々のインスタンス変数でファイルを開くとなんだか混乱するのではないかと思います。
ReadFileで現在位置が進んだ後に、WriteFile側でSetLengthでサイズ変更したりとか…。
ファイルを作成し、ファイルに書き込み、閉じない内にファイルを読みたいのであれば、FileAccess.ReadWriteは検討してみてはいかがでしょうか?