現場で泣かないための「ファイル操作」:VB.NETで堅牢なツールを作る極意
業務自動化ツールを開発する際、避けて通れないのが「ファイル・フォルダ操作」です。しかし、多くの初心者がここでお粗末なコードを書き、後日「ファイルが見つからない」「権限エラーで落ちる」というトラブルで深夜の修正に追われることになります。
伝説的なアーキテクトとして、一つだけ断言します。「ファイル操作は、祈りではなく『検証』で制御するものだ」。
本記事では、ただ動くだけのコードではなく、過酷な実務環境でもタフに生き残るための「System.IO」の正しい作法を伝授します。
—
1. なぜ「雑な実装」が現場を破壊するのか
初心者が陥りがちなのが、以下のようなコードです。
.net
‘ 悪い例:存在確認なしでいきなり読み込む
Dim content As String = System.IO.File.ReadAllText(“C:\data.txt”)
これがなぜダメなのか。理由はシンプルです。「ファイルは、読み込む瞬間に誰かに消されているかもしれないから」です。ネットワークドライブや共有フォルダであればなおさらです。
プロフェッショナルな設計では、必ず「存在確認」「例外ハンドリング」「リソースの解放」の3段階を考慮します。
—
2. 現場でそのまま使える「堅牢なテキスト読み書き」レシピ
以下は、実務で頻出する「テキストファイルの読み込み」と「ディレクトリの作成」を安全に行うためのテンプレートコードです。
.net
Imports System.IO
Public Class FileOperator
”’
”’
Public Function ReadTextSafe(ByVal filePath As String) As String
‘ 1. 存在確認:論理的なエラーを防ぐための第一歩
If Not File.Exists(filePath) Then
Throw New FileNotFoundException($”対象ファイルが見つかりません: {filePath}”)
End If
Try
‘ 2. Using句でリソースを確実に解放する(これがメモリリークを防ぐ鉄則)
Using reader As New StreamReader(filePath, System.Text.Encoding.UTF8)
Return reader.ReadToEnd()
End Using
Catch ex As IOException
‘ ファイルが別のプロセスによってロックされている場合などを捕捉
Console.WriteLine($”I/Oエラーが発生しました: {ex.Message}”)
Return String.Empty
End Try
End Function
”’
”’
Public Sub WriteTextSafe(ByVal folderPath As String, ByVal fileName As String, ByVal content As String)
‘ フォルダがなければ作成する
If Not Directory.Exists(folderPath) Then
Directory.CreateDirectory(folderPath)
End If
Dim fullPath As String = Path.Combine(folderPath, fileName)
‘ WriteAllTextは内部でStreamを適切に扱うため、小規模な書き込みには最適
File.WriteAllText(fullPath, content, System.Text.Encoding.UTF8)
End Sub
End Class
—
3. アーキテクトのこだわり:知っておくべき「3つの鉄則」
① `Path.Combine` を使い倒せ
「`folder & “\” & fileName`」という結合は、パスの区切り文字(`\`)の重複や欠落を生む温床です。`Path.Combine(folder, fileName)` を使えば、OSが自動的に適切な区切り文字を補完してくれます。これを習慣にするだけで、バグの発生率が数%下がります。
② `Using` 構文は「守護神」
`StreamReader` や `StreamWriter` を使う際は、必ず `Using` 構文で囲ってください。`Using` は、処理が終わった瞬間にメモリ上のリソースを強制的に破棄します。これを使わないと、ファイルが掴まれたままになり、後続の削除や移動操作で「別のプロセスが使用中です」という悪名高いエラーに見舞われます。
③ 例外を「無視」しない
初心者ほど `Try…Catch` の中身を空にして黙らせたがりますが、これはデバッグを不可能にする行為です。例外が発生した場合は、最低限「どこで、何が起きたか」をログに出力してください。問題が起きた際、原因が即座に特定できるコードこそが、保守性の高いプロダクションコードです。
—
結論:自動化ツールは「信頼性」が全て
あなたが書くツールは、その瞬間は動いても、1ヶ月後のあなた、あるいは別の担当者が触ることになります。
- 存在確認を怠らない
- リソースはUsingで解放する
- 例外から逃げない
この基本を徹底するだけで、あなたの作るツールは「すぐ壊れるオモチャ」から「現場を支える武器」へと進化します。次のコードを書くとき、ぜひこの設計思想を思い出してください。
技術的な疑問や、より高度な非同期I/O処理への挑戦など、さらなる高みを目指す準備ができたら、またいつでも聞きに来てください。健闘を祈ります。
