【実務・中級編】VB.NETで実現するファイル・フォルダ操作:System.IO.FileとDirectoryクラスの基本レシピ – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

伝説のアーキテクトが説く:VB.NETファイル操作の「脱・レガシー」と堅牢な設計術

業務自動化の現場に足を踏み入れると、未だにVB6時代の遺物である `FileSystemObject` や、VB.NETの旧来的な `Microsoft.VisualBasic.FileIO` にしがみついているコードを目にする。これらは確かに「動く」が、現代の.NET環境下では、リソースリークや例外処理の不備を招く「時限爆弾」になりかねない。

本稿では、`.NET System.IO` 名前空間を使いこなし、堅牢で保守性の高いファイル操作を実現するための「極限のレシピ」を伝授する。

1. なぜ「FileSystemモジュール」を使ってはいけないのか

多くの開発者が旧来の命令を使う理由は「楽だから」だ。しかし、`FileOpen` や `Print` といったレガシーな命令は、型安全性が低く、エラーハンドリングが環境に依存しやすい。

我々が目指すべきは、「System.IO クラス」による管理だ。これらは .NET のオブジェクトライフサイクルに完全に統合されており、ストリームのクローズ漏れや、OSリソースの解放遅延を最小限に抑える設計が自然と可能になる。

2. 堅牢なファイル操作の鉄則:Using句によるリソース管理

ファイル入出力において最も恐ろしいのは「ファイルが掴まれたまま解放されない(ロックされる)」ことだ。これを防ぐ唯一の解法が `Using` ステートメントである。

実践コード:安全なテキスト書き込み

Imports System.IO

Public Sub WriteLogSafely(filePath As String, message As String)
‘ Using句を使うことで、例外発生時でも確実にリソース(ファイルハンドル)を解放する
Try
‘ 追記モードでファイルを開く
Using sw As New StreamWriter(filePath, append:=True, encoding:=System.Text.Encoding.UTF8)
sw.WriteLine($”{DateTime.Now:yyyy/MM/dd HH:mm:ss} – {message}”)
End Using
Catch ex As IOException
‘ ネットワークドライブの切断や権限不足をここでキャッチ
Console.WriteLine($”ファイル操作に失敗しました: {ex.Message}”)
End Try
End Sub

アーキテクトの助言:
`StreamWriter` を手動で `Close()` してはいけない。例外が発生した瞬間に `Close()` はスキップされる。`Using` を使えば、スコープを抜ける際に確実に `Dispose` が呼び出される。これが業務自動化における「正義」だ。

3. ファイル・フォルダ操作のベストプラクティス

`System.IO.File` と `System.IO.Directory` は静的メソッドを提供しており、非常に強力だ。しかし、実務では「ファイルが存在するか」「ディレクトリが空か」といった事前チェックが命運を分ける。

ファイルのコピーとバックアップ

Public Sub SafeFileCopy(sourcePath As String, destPath As String)
‘ 存在チェックを忘れないこと。
‘ ただし、存在チェックと操作の間で他プロセスが介入する「競合状態」には注意せよ。
If Not File.Exists(sourcePath) Then
Throw New FileNotFoundException(“ソースファイルが存在しません”, sourcePath)
End If

‘ 同名のファイルがある場合は上書きするが、バックアップを取るのがプロの流儀
If File.Exists(destPath) Then
File.Copy(destPath, destPath & “.bak”, overwrite:=True)
End If

File.Copy(sourcePath, destPath, overwrite:=True)
End Sub

4. データベース連携時の「ファイル・パス」設計

業務ツールでよくある「CSVを読み込んでDBへ取り込む」処理において、パスをハードコーディングするのは自殺行為だ。

1. 設定ファイル化: パスは必ず `App.config` または `appsettings.json` で管理する。
2. Pathクラスの活用: 文字列結合でパスを作ってはならない。必ず `Path.Combine()` を使うこと。OSごとのパス区切り文字の違いを吸収するためだ。

‘ 悪い例: Path1 & “\” & FileName (OS依存でバグる)
‘ 良い例:
Dim baseDir As String = My.Settings.ImportFolder
Dim fileName As String = “data.csv”
Dim fullPath As String = Path.Combine(baseDir, fileName)

5. 伝説のエンジニアからの最後通告

ファイル操作は、ネットワーク、OS、ディスクの物理状態という「制御不能な変数」に依存する最も不安定な領域だ。だからこそ、コードは極限まで「シンプル」かつ「堅牢」である必要がある。

  • 例外は隠蔽しない: 予期せぬエラーは適切にログに吐き出し、上層の呼び出し元へ伝えるべきだ。
  • 非同期処理の検討: 大量ファイルの操作を行う場合、メインスレッドを止めないよう `Async/Await` の活用を検討せよ。

VB.NETを使いこなすということは、言語の歴史に甘えることではなく、現代の .NET のパワーを最大限に引き出すことだ。今日書くそのコードが、5年後の保守担当者にとっての「教科書」になるような、美しいコードを書いてほしい。

あなたの自動化ツールが、現場を救う最強の武器になることを期待している。

タイトルとURLをコピーしました