ファイルの「時間」を支配する:VBScriptにおける更新日時とアクセス日時の真実
こんにちは。自動化の荒波を渡るエンジニアの皆さん。
マクロの記録機能を使って「とりあえず動くもの」を作る段階を卒業し、いよいよ「プログラムに意思を持たせる」段階へ足を踏み入れましたね。素晴らしい一歩です。
今日、私たちが解き明かすのは、ファイルシステムという広大な宇宙における「時間の概念」です。
VBScriptでファイル操作を行う際、多くの人が `FileSystemObject`(通称FSO)という強力な武器を手にします。しかし、その武器に含まれる「日時プロパティ」を正しく使い分けられず、思わぬバグやデータの消失を招いてしまうケースを、私はこれまで何度も見てきました。
「ファイルがいつ更新されたか」と「ファイルがいつ読み込まれたか」。
この違いを正確に理解し、コードに落とし込めるようになれば、あなたの自動化スクリプトは「ただの記録」から「知的な監査ツール」へと進化します。
さあ、準備はいいですか? 極限の知見へと踏み込んでいきましょう。
1. ファイルが持つ「3つの時間」を知る
FSOの `GetFile` メソッドで取得できるファイルオブジェクトには、主に3つの重要な時間軸が存在します。これらを混同するのは、エンジニアとして避けるべき致命的なミスです。
| プロパティ名 | 意味 | エンジニアの視点 |
|---|---|---|
| `DateCreated` | 作成日時 | そのファイルがこの世に誕生した瞬間。 |
| `DateLastModified` | 最終更新日時 | ファイルの中身(データ)が書き換えられた瞬間。 |
| `DateLastAccessed` | 最終アクセス日時 | ファイルが「開かれた」あるいは「読み取られた」瞬間。 |
なぜ「更新」と「アクセス」を分ける必要があるのか?
例えば、あなたが「古い不要なファイルを削除するスクリプト」を書くとしましょう。
- 「半年間、中身が更新されていないファイル」を消したいなら、`DateLastModified` を見ます。
- 「半年間、誰にも一度も開かれていないファイル」を消したいなら、`DateLastAccessed` を見ます。
「中身は古いけれど、誰かが確認のために開いた(アクセスした)ファイル」を誤って削除してしまったら……それは重大な事故になりますよね。ここを使い分けるのが、プロの仕事です。
2. 実践:GetFileメソッドによる情報の抽出
では、実際にコードを見てみましょう。
ここでは、特定のファイルに対して、これらの日時を正確に取得し、表示するスクリプトを記述します。
' ==========================================================================
' テーマ:GetFileメソッドによるファイル属性情報の取得と解析
' 目的:更新日時とアクセス日時の違いを理解し、ログとして出力する
' ==========================================================================
Option Explicit
Dim fso, targetFile, filePath
Dim createdDate, modifiedDate, accessedDate
' 1. 対象となるファイルのパスを指定(環境に合わせて書き換えてください)
filePath = "C:\Temp\test_sample.txt"
' 2. FileSystemObjectのインスタンス化
' これがファイルシステムへの「入り口」となります
Set fso = CreateObject("Scripting.FileSystemObject")
' 3. ファイルの存在確認(エラー回避のための必須工程!)
' 存在しないファイルをGetFileしようとすると、スクリプトは即座にクラッシュします
If fso.FileExists(filePath) Then
' 4. GetFileメソッドにより、ファイルオブジェクトを取得
' これにより、ファイルに関するあらゆる属性にアクセス可能になります
Set targetFile = fso.GetFile(filePath)
' 5. 各種日時の取得
createdDate = targetFile.DateCreated
modifiedDate = targetFile.DateLastModified
accessedDate = targetFile.DateLastAccessed
' 6. 結果の表示
MsgBox "【ファイル解析レポート】" & vbCrLf & _
"対象パス: " & filePath & vbCrLf & _
"---------------------------------------" & vbCrLf & _
"作成日時 : " & createdDate & vbCrLf & _
"更新日時 : " & modifiedDate & vbCrLf & _
"アクセス日時: " & accessedDate, vbInformation, "解析完了"
Else
' ファイルが見つからない場合の適切なエラーハンドリング
MsgBox "エラー: 指定されたファイルが見つかりません。" & vbCrLf & filePath, vbCritical, "ファイル不在"
End If
' 7. オブジェクトの解放
' ライフサイクルを管理することは、メモリリークを防ぐエンジニアの嗜みです
Set targetFile = Nothing
Set fso = Nothing
3. 陥りやすい「罠」:DateLastAccessed の不確実性
ここで、伝説的なアーキテクトとして、一つだけ重要な警告(アドバイス)をさせてください。
実は、`DateLastAccessed`(最終アクセス日時)は、現代のWindows環境においては必ずしも正確ではないという事実があります。
なぜ正確ではないのか?
Windowsのパフォーマンスを向上させるため、OSの設定(レジストリ)によっては、「ファイルにアクセスした瞬間にアクセス日時を更新する」という処理をあえてスキップすることがあります。頻繁にアクセス日時を書き換える作業は、ディスクへの負荷になるからです。
【エンジニアとしての判断基準】
- 「データの変更履歴」を厳密に追いたい場合 $\rightarrow$ 必ず `DateLastModified` を使いなさい。
- 「ファイルの利用状況」を調べたい場合 $\rightarrow$ `DateLastAccessed` を使いつつも、OSの設定によって値が更新されていない可能性があることを念頭に置き、「絶対的な証拠」として過信しすぎないこと。
これが、現場でトラブルを回避するための「知恵」です。
4. まとめ:ここをクリアすれば、基本はバッチリです
今回の学びを整理しましょう。
1. `DateLastModified` は「内容が変わった時」の記録。監査ログやバックアップの判断基準に最適。
2. `DateLastAccessed` は「見た時」の記録。不要ファイル抽出に便利だが、OSの設定により更新されないリスクがある。
3. `FileExists` によるチェックは、プログラミングにおける「防御的設計」の基本。
4. オブジェクトの解放(Set … = Nothing)は、リソースを大切にするエンジニアの作法。
プログラミングは、単に命令を並べる作業ではありません。対象となるオブジェクト(今回で言えばファイル)がどのような性質を持ち、どのように振る舞うのかを深く理解することから始まります。
一歩ずつ、着実に。
この知識が、あなたの自動化スキルを一段上のステージへと押し上げることを願っています。
また次の講義でお会いしましょう。応援していますよ。
