ファイル/フォルダのプロパティの参照や属性の設定、オブジェクトとコレクションを利用したきめ細かいファイル操作の手法などについて解説する。
前回は、FileSystemObjectオブジェクト直下のメソッドを使ってファイル処理を行う方法について述べた。今回からはFileSystemObjectのメソッドやプロパティから、ファイル/フォルダ/ドライブのコレクションやオブジェクトのインスタンスを生成し、それらを扱うことできめ細かいファイル操作を行う手法について述べる。
■連載目次
第1回 WSHを始めよう
第2回 VBScript基本(1)文字列の入出力
第3回 VBScript基本(2)計算と分岐処理
第4回 関数を使いこなす:文字列、数値、日付
第5回 データ型について理解を深めよう
第6回 VBScriptの配列を極める
第7回 Subプロシージャで処理を定義
第8回 Functionプロシージャで関数を定義
第9回 VBScriptのオブジェクトを使いこなす
第10回 WScriptオブジェクト(1)
第11回 WScriptオブジェクト(2)
第12回 WshShellオブジェクト(1)
第13回 WshShellオブジェクト(2)
第14回 WshShellオブジェクト(3)
第15回 WshNetworkオブジェクト
第16回 FileSystemObjectオブジェクト(1)
第17回 FileSystemObjectオブジェクト(2)
第18回 FileSystemObjectオブジェクト(3)
第19回 TextStream/Dictionaryオブジェクト
オブジェクトやコレクションの説明の前に、エラー処理について触れておこう。
前回は、説明の単純化のため、ファイル/フォルダ処理中にエラー(例外)がまったく発生しないケースを想定したコードを記述したが、実際に利用する場合は何らかの原因でエラーが発生する可能性があるので、それらに適切に対処する必要がある。今回説明する項目でもそれは同じであるが、まずは前回のおさらいと、エラー対処をしたコードはどのようなものかを併せて紹介しよう。どちらも基本は同じなので、1つだけコードを取り上げて説明する。
次のリストは、前回の「2.ファイル/フォルダの操作」の最初で取り上げた、フォルダ作成のコードである。これに対して最も単純なエラー対策を施すと、例えば次のようになる。
Option Explicit
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim strNewFolderName
strNewFolderName = "新しいフォルダ"
'もし、フォルダが存在しない場合は作成する
If Not objFSO.FolderExists(strNewFolderName) Then
On Error Resume Next
objFSO.CreateFolder strNewFolderName
If Err.Number = 0 Then
MsgBox _
objFSO.GetAbsolutePathName(strNewFolderName) & vbCrLf & _
"を作成しました。"
Else
MsgBox _
objFSO.GetAbsolutePathName(strNewFolderName) & vbCrLf & _
"の作成に失敗しました。" & _
vbCrLf & Err.Number & ": " & Err.Description
End If
On Error Goto 0
'もしフォルダが存在する場合は何もしない
Else
MsgBox "すでに" & vbCrLf & _
objFSO.GetAbsolutePathName(strNewFolderName) & vbCrLf & _
"が存在します。"
End If
Set objFSO = Nothing
エラー処理の基本は第9回で述べたのでここでは詳しく説明しないが、VBScriptでは、エラーが発生する可能性のある個所をOn Error Resume NextとOn Error Goto 0ステートメントで囲み、その中でErrオブジェクトを参照し、Err.Numberが0でない場合、すなわちエラーが発生した場合に適切な処理を行うのが基本である。
この例では、まずフォルダが存在するかどうかで条件分岐をして、フォルダが存在しないことを確認している。そのため、フォルダを書き込む処理は必ず成功するから、エラー処理は不要だと思うかもしれない。だが、フォルダが存在しないことを確認した直後に(OSやほかのアプリケーションなどによって)フォルダが作成されてしまうと、チェックが無意味になる可能性がある。FolderExistsメソッドによる事前確認はあくまで予防策でしかない(ただし、多くのエラーはこれで回避できるので、この方法を否定はしない)。また、たとえフォルダが存在していなくても、実際に新しいフォルダを作成するためには、まだいくつかの条件をクリアしなければならない。読み取り専用属性は付いていないか、パスに、不正な文字(パスとして用いることができない「*」などの文字)が含まれていないか、親フォルダに現在のユーザーが書き込む権限はあるか、フォルダが2階層以上になっていないか(つまり引数に「a\新しいフォルダ」などとしていないか。ここで「a」は存在しないフォルダとする)、ディスクの空き容量は十分か、ディレクトリに含まれるファイルやフォルダ数の最大数は超えていないか、ほかのプロセスがロックをかけていないか、などなど、ファイル・システム操作におけるエラーが発生する要因は枚挙にいとまがない。
これらのエラーが発生するとフォルダの作成は失敗する。そのため、On Errorステートメントを使用していないとスクリプトはそこで停止してしまう。これを避けるためこのスクリプトではErr.Numberが0でない場合はフォルダ作成が失敗した旨を表示するという簡単なエラー処理を施した。この例だとエラーが発生してもスクリプトは停止せず、問題を解決した後、処理を続行できる。実際には、Select Case Err.Numberのようにして、エラーの種類によってエラー処理を分岐する必要も出てくるだろう(本稿の後半に例を示しているので参考にしていただきたい)。
FileSystemObjectオブジェクトを使ったファイル/フォルダ操作を実運用環境で使う際は、エラー処理が必須であるということを覚えておいてもらいたい。
Copyright© Digital Advantage Corp. All Rights Reserved.