こんにちは!現場のトラブルシューティングで数々の修羅場をくぐり抜けてきた、君の頼れる先輩エンジニアだ。
今日は、VBScriptを使ったファイル操作の現場で、誰もが一度はハマる「アクセス拒否(書き込みできません)」エラーの正体と、その完璧な回避策について伝授しよう。
「昨日まで動いていたバッチ処理が、急に止まった…」
「エラーログを見たら『書き込みできません (Error 70: Permission denied)』って出てるんだけど、何これ?」
そんな絶望を味わったことはないかな?
原因の多くは、対象のファイルに「読み取り専用」属性がついていることだ。FSO(FileSystemObject)の標準的なメソッドは、この頑固な属性を前にすると、あっさり白旗を上げてしまう。
ここをクリアすれば、君の書くVBScriptは一段上の「プロの仕事」になる。さあ、本質をマスターしていこう!
—
1. なぜエラーが起きる? FSOの「お作法」を知る
VBScriptでファイル操作の主力となるのが、`Scripting.FileSystemObject` だ。このFSOが提供するファイル作成(`CreateTextFile`)や削除(`DeleteFile`)のメソッドには、実は知られざる仕様上のクセがある。
`CreateTextFile` の悲劇
既存のファイルを上書きしようとして `CreateTextFile` を呼んだとき、そのファイルが「読み取り専用」になっていると、FSOは問答無用でエラーを吐いて処理を中断する。
`DeleteFile` の救世主「Force」パラメータ
一方、ファイルを削除する `DeleteFile` メソッドには、実は第2引数に`Force`(強制)パラメータが用意されている。
fso.DeleteFile “C:\path\to\file.txt”, [Force]
- `False` (または省略): 読み取り専用ファイルは削除できずにエラー。
- `True` : 読み取り専用属性を無視して強制削除。
「おっ、じゃあ `DeleteFile` の第に引数に `True` を突っ込んでおけば万全じゃん!」と思ったそこの君。鋭いが、それだけでは実務の現場を生き抜くには少し甘い。
なぜなら、ファイルを「新規作成・上書き」する `CreateTextFile` には、このような強力なForceパラメータが存在しないからだ。ここに、多くの開発者がハマる罠がある。
—
2. 実務で使える!「事前権限チェック&安全上書き」のベストプラクティス
では、読み取り専用かもしれないファイルを安全に上書き・更新するにはどうすればいいのか?
答えはシンプルだ。「操作する前に、ファイルの属性をチェックして、必要なら剥がす」。これに尽きる。
現場のプロが使っている、堅牢なコードのテンプレートを共有しよう。
実装サンプルコード
Option Explicit
Sub SafeOverwriteFile()
Dim fso, targetPath, targetFile
targetPath = “C:\Work\sample.txt”
‘ FSOのインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. ファイルが存在するかチェック
If fso.FileExists(targetPath) Then
‘ 2. ファイルオブジェクトを取得
Set targetFile = fso.GetFile(targetPath)
‘ 3. 「読み取り専用」属性がついているかチェック
‘ Attributesプロパティのビット演算で判定する
If (targetFile.Attributes And 1) = 1 Then
WScript.Echo “読み取り専用属性を検知しました。解除します。”
‘ 属性から「読み取り専用(1)」を外す(標準属性に戻すなら 0 を代入)
targetFile.Attributes = targetFile.Attributes – 1
End If
Set targetFile = Nothing
End If
‘ 4. 安全にテキストファイルを作成(上書き)
‘ 第2引数を True にすることで既存ファイルを上書き許可
Dim ts
Set ts = fso.CreateTextFile(targetPath, True)
‘ データの書き込み
ts.WriteLine “これは極限まで安全に書き込まれたテキストです。”
ts.Close
Set ts = Nothing
Set fso = Nothing
WScript.Echo “ファイルの書き込みが正常に完了しました!”
End Sub
‘ メイン処理の実行
SafeOverwriteFile()
—
3. コードのキモ:ビット演算による属性チェック
上記のコードで、少し難しく見えたのがこの部分だよね。
If (targetFile.Attributes And 1) = 1 Then
FSOの `Attributes` プロパティは、ファイルが持つ様々な属性(読み取り専用、隠しファイル、システムファイルなど)を数値の足し算(ビットフラグ)で保持している。
- `1`: 読み取り専用 (ReadOnly)
- `2`: 隠しファイル (Hidden)
- `4`: システムファイル (System)
例えば、ファイルが「読み取り専用」かつ「隠しファイル」だった場合、`Attributes` の値は `1 + 2 = 3` になる。
ここで `And 1` というビット演算を行うことで、「他の属性がどうあれ、読み取り専用フラグが立っているか?」を正確にブチ抜いて判定できるんだ。
そして、読み取り専用を解除したい時は、現在の属性値から `1` を引き算してあげる。
targetFile.Attributes = targetFile.Attributes – 1
これによって、エラーを未然に防ぎ、確実に `CreateTextFile` を成功させることができるというわけだ。
—
まとめ:ここをクリアすれば、VBScriptの基本はバッチリ!
- エラーの元凶を知る: 読み取り専用ファイルへの上書き(`CreateTextFile`)はエラーになりやすい。
- `DeleteFile` の `True`: 削除の時は第2引数に `True` を渡せば強制削除できると覚えておく。
- 上書きの極意: 事前に `GetFile` でファイルオブジェクトを捕まえ、属性をチェック&剥がしてから書き込むのがプロの流儀。
ファイルシステムを相手にするスクリプトでは、「こうなっているはずだ」という思い込みを捨て、「もしかしたら読み取り専用かもしれない」という防衛的プログラミングが何よりも大切なんだ。
ここをマスターした君なら、もう現場でファイル操作のエラーにビクビクする必要はない。自信を持って、スマートな自動化ツールを作り上げてくれよ!
