System.IO.File.OpenReadは”読み取り専用”ではない話

2021-02-27

プログラミング初心者だと選びがちなメソッドなので注意喚起も兼ねてこちらに。
引数が少なくて選びやすいけど、使う場合はそれなりに考慮が必要です。

発生した問題

タイトルの通り。File.OpenReadを使ったらファイル掴んでた。もともとStreamReader使っていて、要件で複数プロセスから安全に読めるようにしたい、てなったので掴まなさそうなのをピックアップしたらしい…が。

たしかにこの説明文だけ見たら、読み取り専用で掴んでいないように見える。Microsoftにも同じ説明が書いてある。英語版でも読んで見たが同じ調子。

Returns
FileStream
A read-only FileStream on the specified path.

.NET documentation | Microsoft Docs

結局、ここで言うread-onlyという文言は動作的に「これを使って書き込みはできませんよ」という意味っぽい。

解決策

解決策としては読み取り専用で開きたいならこんな感じで書くこと。とりあえず簡単に1行だけ書いたが、使用する場合はもちろんusingを使おう。

FileStream filestream = new FileStream(@"読みたいファイルのパス", FileMode.Open, FileAccess.Read);