【入門編】【アクセス拒否対策】CreateTextFile・DeleteFileのForceパラメータ仕様と事前権限チェックによるエラー回避策 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場のトラブルシューティングで数々の修羅場をくぐり抜けてきた、君の頼れる先輩エンジニアだ。

今日は、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` でファイルオブジェクトを捕まえ、属性をチェック&剥がしてから書き込むのがプロの流儀。

ファイルシステムを相手にするスクリプトでは、「こうなっているはずだ」という思い込みを捨て、「もしかしたら読み取り専用かもしれない」という防衛的プログラミングが何よりも大切なんだ。

ここをマスターした君なら、もう現場でファイル操作のエラーにビクビクする必要はない。自信を持って、スマートな自動化ツールを作り上げてくれよ!

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