|
.NET TIPS オープン中のファイルにアクセスするには?[C#、VB]デジタルアドバンテージ 岸本 真二郎2008/02/14 |
![]() |
|
|
|
.NET Frameworkで、テキスト・ファイルを読み書きする場合は、StreamReaderクラスやStreamWriterクラス(ともにSystem.IO名前空間)を利用するのが一般的だ。オンライン・ヘルプにあるように、テキスト・ファイルの内容を読む場合、次のように記述できる。
| ||
| StreamReaderクラスを使ったファイルの読み込み(上:C#、下:VB) | ||
| StreamReaderクラスのオンライン・ヘルプから転載したコード。 |
このコードでは、StreamReaderクラスのコンストラクタにファイル名を指定してStreamReaderのインスタンスを作成し、ファイルの内容を読み込んでいる。
通常のファイルの読み込みならこれで問題はないのだが、ほかのプロセスがオープン中のファイルをStreamReaderクラスを使ってアクセスしようとすると例外が発生してファイルがオープンできないことがある。その際、
「別のプロセスで使用されているため、プロセスはファイル“TestFile.txt”にアクセスできません」
というメッセージが例外情報として返される場合があるが、これは別のプロセスがファイルをオープンしているため、自プロセスからは『無条件に』オープンできないのではなく、
「ファイル・オープン時の“パラメータ指定が条件にマッチしない”のでファイルにアクセスできません」
と解釈した方がよい。この場合、StreamReaderクラスではなくFileStreamクラス(System.IO名前空間)を使ってファイルをオープンする際に詳細なパラメータ設定を指定することでファイルをオープンできることがあるためだ。
FileStreamクラスによるファイルのオープン
FileStreamのコンストラクタにはさまざまなパラメータの組み合わせがあり、どれを使うべきか迷ってしまうかもしれないが、ここではファイル名の指定に加えて、FileMode型、FileAccess型、FileShare型の3つのパラメータを使用するコンストラクタを使う。このコンストラクタは、次のように宣言されている
| ||
| FileStreamクラスのコンストラクタの1つ(上:C#、下:VB) |
FileModeパラメータは、ファイルを開く方法を指定するもので、既存ファイルの読み取りでオープンするなら「FileMode.Open」を指定する。次のFileAccessパラメータは、アクセスの種類を示すもので、今回は内容を読むことしかしないので「FileAccess.Read」を指定する。
そして3番目のFileShareパラメータだが、これは対象のファイルに対する共有方法指定するもので、これには、「FileShare.None」「FileShare.Read」「FileShare.Write」「FileShare.ReadWrite」「FileShare.Delete」「FileShare.Inheritable」が指定できる。StreamReaderクラスはどうやら、ファイル・オープン時に「FileShare.Read」しか与えていないようなので、ここで「FileShare.ReadWrite」を指定すれば、すでに書き込みでオープン中のファイルをオープンすることができる。
具体的には次のようにパラメータを指定して読み込む。
| ||
| FileStreamクラスを使ったファイルの読み込み(上:C#、下:VB) |
ここではFileStreamクラスを使ってファイル・アクセスの条件をしてオープンして得られたストリーム・オブジェクトをStreamReaderのコンストラクタに渡している。エンコードを指定する必要はないのだが、実際にはShift-JISでファイルを読み込むことが多いと思う。
FileStreamクラスのインスタンスをさらにStreamReaderクラスのコンストラクタに渡しているのは、想定しているファイルがテキスト・ファイルで、行単位の読み込みを行うことを前提にしているからだ。バイナリ・ファイルでエンコードなども特に必要がないなら、FileStreamクラスのインスタンスを直接使うが手っ取り早い。
もちろん、ここで紹介した「FileShare.ReadWrite」のパラメータ設定だけでどんなオープン中のファイルでも読み込みが行えるわけではない点を了承していただきたい。複数のプロセスで1つのファイルを同時にオープンすることはあまり考えられないが、IISのアクセス・ログを読み込んだり、デバッグ用に出力しているログ・ファイルをトレースしたりすることもあるだろう。
共有するファイルのアクセス設定などがあらかじめ分かっている場合は特に問題ないが、ファイルを共有する状況によってはFileStreamクラスを使って適切なパラメータを選択することでファイルがオープンできる場合がある。![]()
| カテゴリ:クラス・ライブラリ 処理対象:テキスト・ファイル 使用ライブラリ:StreamReaderクラス(System.IO名前空間) 使用ライブラリ:FileStreamクラス(System.IO名前空間) 使用ライブラリ:FileShare列挙体(System.IO名前空間) |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


