DirectoryNotFoundException について

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

目次

この例外エラーの説明

Directory Not Found(指定されたフォルダが見つからなかったので発生する)Exception です。フォルダ操作の他、ファイル操作でも発生します。

事例とその対処方法

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

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

System.IO.File

1つ目

ファイルを読み込もうとしたのにフォルダのパスを指定している場合に発生します。できれば "これはフォルダです。ファイルを指定してください。" みたいな旨のメッセージだったら分かりやすかったかもしれないですね。

Dim logFile As String = "C:\Temp\"
Dim logData As String = File.ReadAllText(logFile)
System.IO.DirectoryNotFoundException: 'パス 'C:\Temp\' の一部が見つかりませんでした。'

また、Temp フォルダが実在していない場合は、FileNotFoundException 扱いになります。

System.IO.FileNotFoundException: 'ファイル 'C:\Temp\' が見つかりませんでした。'

事前に、ファイルの存在チェックを実施してからファイル操作するようにします。

Dim logFile As String = "C:\Temp\"
If File.Exists(logFile) Then
    Dim logData As String = File.ReadAllText(logFile)
End If

2つ目

ファイルを新規作成で書き込む際、途中のフォルダが存在していない場合は例外エラーが発生します。WriteAllText メソッドには、途中のフォルダごとファイルを作成する機能はついていません。ファイル書き込みをする際はディレクトリ構成も忘れないようにします。

Dim saveFile As String = "C:\Aaa\settings.dat"
File.WriteAllText(saveFile, "abc")
System.IO.DirectoryNotFoundException: 'パス 'C:\Aaa\settings.dat' の一部が見つかりませんでした。'