IOException について

初級者向けにおさらいします。

目次

この例外エラーの説明

IO は Input/Output の略で、ファイルやフォルダなどのデータにアクセスするときに発生します。

事例とその対処方法

例外エラーは、想定外の扱われ方をすると発生して飛んで来ます。それは命令の使い方が間違っていたり、存在しないデータを扱おうとしていたり、アカウント権限を越えたアクセスをしようとしていたり(Windows 側やウェブ側の話だったり)、サービスが動いていないのに連携しようとしたり、製品上の仕様考慮モレだったり、そういう系です。

こうなっている前提のはずだから、こうやろうとしたのに、実際はここがこうなっているからダメじゃん!こういう場合の処理が無いじゃん!みたいなコードになっていませんか?

System.IO.FileStream

Dim logFile As String = "error.log"

' 他プロセス(サービスとか他アプリ)で開いている最中というシチュエーションにする(同時に開かれないように、ファイルはロックしている)
Dim fs As FileStream = New FileStream(logFile, FileMode.Open, FileAccess.Read, FileShare.None)

' ファイルを開こうとする
Dim info As String = File.ReadAllText(logFile)
System.IO.IOException: '別のプロセスで使用されているため、プロセスはファイル 'C:\~\bin\Debug\error.log' にアクセスできません。'

先にファイルを開いているアプリが、作成者が自分の場合はロックを掛けずにファイル操作をするように修正すればいいのですが、第三者が作成されたアプリの場合、修正を待つしかないのは難しいのではと思います。例えば、オリジナルには何もせずに、一時的に自分のところのフォルダにコピーしてきて操作するなどの手があります。

Dim original As String = "original.log"
Dim logFile As String = "error.log"

' コピーして読み込む
File.Copy(original, logFile)
Dim info As String = File.ReadAllText(logFile)