2010年10月19日火曜日

.NET ファイル読み込み時の注意点

以下のコードは
ファイルの存在チェックを行い、
ファイルが存在する場合はファイルの内容を読み込みます。
Dim path As String = "D:\test.csv"  '※D:\test.csvは存在するものとします。
'ファイルが存在するかどうか
Dim isExists As Boolean = System.IO.File.Exists(path)
Console.WriteLine("isExists:" & isExists)
'ファイル読み込み
If isExists = True Then
    Dim line() As String = System.IO.File.ReadAllLines(path)
End If

ファイルパスの「途中」に改行コードを追加すると、System.IO.File.Exists()メソッドはfalseを返します。
なので、ファイル読み込みは行われません。
Dim path As String = "D:\" & Environment.NewLine & "test.csv"


ファイルパスの「末尾」に改行コードを追加すると System.IO.File.Exists()メソッドはtrueを返します。
なので、ファイル読み込みが行われるのですが、System.IO.File.ReadAllLines()メソッドは例外「ArgumentExceptionp:パスに無効な文字が含まれます。」をスローします。
Dim path As String = "D:\test.csv" & Environment.NewLine


結論
ファイル存在チェックとは別にファイルに不正な文字が含まれているかチェックする必要がある。
Dim path As String = "D:\test.csv" & Environment.NewLine
'パスに無効な文字が含まれていないか
Dim isInvalidChars As Boolean = (path.IndexOfAny(System.IO.Path.GetInvalidPathChars) <> -1)
Console.WriteLine("isInvalidChars:" & isInvalidChars)
'ファイルが存在するかどうか
Dim isExists As Boolean = System.IO.File.Exists(path)
Console.WriteLine("isExists:" & isExists)
'ファイル読み込み
If isExists = True AndAlso isInvalidChars = True Then
    Dim line() As String = System.IO.File.ReadAllLines(path)
End If

0 件のコメント: