連載
» 2008年05月15日 00時00分 公開

基礎解説 演習方式で身につけるチェック式WSH超入門:第17回 FileSystemObjectオブジェクトを利用する(2) (1/5)

ファイル/フォルダのプロパティの参照や属性の設定、オブジェクトとコレクションを利用したきめ細かいファイル操作の手法などについて解説する。

[牟田口大介(Microsoft MVP Data Center Management - Admin Frameworks),著]
基礎解説 演習方式で身につけるチェック式WSH超入門
Windows Server Insider


「基礎解説 演習方式で身につけるチェック式WSH超入門」のインデックス

連載目次

 前回は、FileSystemObjectオブジェクト直下のメソッドを使ってファイル処理を行う方法について述べた。今回からはFileSystemObjectのメソッドやプロパティから、ファイル/フォルダ/ドライブのコレクションやオブジェクトのインスタンスを生成し、それらを扱うことできめ細かいファイル操作を行う手法について述べる。

エラー処理のためのコードを追加する

 オブジェクトやコレクションの説明の前に、エラー処理について触れておこう。

 前回は、説明の単純化のため、ファイル/フォルダ処理中にエラー(例外)がまったく発生しないケースを想定したコードを記述したが、実際に利用する場合は何らかの原因でエラーが発生する可能性があるので、それらに適切に対処する必要がある。今回説明する項目でもそれは同じであるが、まずは前回のおさらいと、エラー対処をしたコードはどのようなものかを併せて紹介しよう。どちらも基本は同じなので、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オブジェクトを使ったファイル/フォルダ操作を実運用環境で使う際は、エラー処理が必須であるということを覚えておいてもらいたい。


       1|2|3|4|5 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。