FileListプロシージャの内容を理解する

次に、メインルーチンから呼び出されるFileListプロシージャの内容を確認します。先ほども述べたように、FileListプロシージャは引数として「フォルダパス」と「出力の開始行」を受け取ることで、フォルダ直下のファイル一覧をExcelに記録するプロシージャです。

Sub FileList(path, i)
  Set fs = CreateObject("Scripting.FileSystemObject")
    ' 指定されたフォルダを表すFolderオブジェクトを生成(1)
  Set fld = fs.GetFolder(path)
    ' フォルダ直下のファイル群を取得し、順に処理(2)
  For Each fl In fld.Files
    ' Excel表のi行目に、ファイル名やフォルダパス、サイズなどを書き込み
    xls.Cells(i, 2) = fl.Name
    xls.Cells(i, 3) = fl.ParentFolder.Path
    xls.Cells(i, 4) = Int(fl.Size / 1024)
    xls.Cells(i, 5) = fl.Type
    xls.Cells(i, 6) = fl.DateCreated
    xls.Cells(i, 7) = fl.DateLastAccessed
    xls.Cells(i, 8) = fl.DateLastModified
    ' 書き込み先の行数を表す変数iをカウントアップ
    i = i + 1
  Next
  For Each subfld In fld.SubFolders
    FileList subfld.Path, i
  Next
End Sub

ファイルシステムにアクセスするのは、テキスト読み書き編でも紹介したScripting.FileSystemObjectオブジェクトの役割です。

ここでは、Scripting.FileSystemObjectオブジェクトのGetFolderメソッドを呼び出して、まず対象となるフォルダを表すFolderオブジェクトを生成しています((1))。

[構文]GetFolderメソッド

Scripting.FileSystemObjectオブジェクト.GetFolder(フォルダのパス)

フォルダ配下のファイル群を取得するには、更に、FolderオブジェクトのFilesプロパティにアクセスします。Filesプロパティは、フォルダ配下のファイル群を表すFilesコレクションを返します((2))。

コレクションとは、要は、オブジェクトの集合を表すものです。コレクションに含まれるオブジェクトに順にアクセスするには、For Each...Next命令を使います。ここでは、Filesコレクションから取り出したFileオブジェクトを順に変数flにセットしながら、配下の処理を行っているわけです。

For Eachループの配下では、取得したファイル情報をExcelワークシートの対応するセルに書き込んでいます。Fileオブジェクト経由で取得できるプロパティは、次の通りです。ちなみに、これらのプロパティはFolderオブジェクトからも共通して利用できます。

Folder/Fileオブジェクトで利用可能なおもなプロパティ

プロパティ名 概要
DateCreated 作成年月日
DateLastAccessed 最終アクセス日
DateLastModified 最終更新日
Drive 属するドライブ(Driveオブジェクト*)
Name フォルダ/ファイル名
ParentFolder 親フォルダ(Folderオブジェクト)
Path パス
ShortName 8.3形式の短いファイル名
ShortPath 8.3形式の短いパス
Size サイズ(バイト単位)
Type 種類
*Driveオブジェクトは、ドライブに関する情報にアクセスするためのオブジェクトです。

指定されたフォルダ直下のファイル一覧を書き出したら、次にフォルダ配下のサブフォルダ一覧を取得します。サブフォルダを取得するには、FolderオブジェクトのSubFoldersプロパティにアクセスするだけです。SubFoldersプロパティはFolderオブジェクトの集合をFoldersコレクションとして返します。

ここでは、取得したFoldersコレクションからFolderオブジェクトを順番に取り出し、それぞれのサブフォルダをFileListプロシージャを再帰的に呼び出すことで処理しているわけです。配下にサブフォルダが存在しない場合は、SubFoldersプロパティは空のコレクションを返しますので、それ以上、再帰呼び出しを行わず、処理は終了します。

まとめ

こうして日本語で説明してみると、かえって複雑に思われるかもしれませんが、再帰呼び出しのしくみさえ理解してしまえば、コードの大部分はExcelへの書き出しなので、それほど複雑なことはありませんね。以上を理解したら、スクリプトファイルに対して、実際にフォルダをドラッグ&ドロップして、「C:\tmp」フォルダの配下にresult.xlsが生成されることを確認してみてください。冒頭の図のようなExcel表が生成されていれば成功です。

以上、今回はファイル一覧を作成するサンプル(filelist.vbs)について紹介しました。Folder/Fileオブジェクトや再帰呼び出しの考え方について理解することも大切ですが、サンプルそのものについてもぜひ活用してみてください。

たとえば、パソコンの中のユーザ・ドキュメントを整理したいと思った場合にも、このサンプルを使ってファイル一覧を作成し、アクセス日時に古い順、サイズの大きい順に並べ替えることで、不要な(と思える)ファイルを抽出するのに役立つでしょう。

山田祥寛
有限会社WINGSプロジェクト代表取締役。Microsoft MVP for ASP/ASP.NET。主な近著に「JavaScriptマスターブック」「ASP.NET AJAXプログラミング」「MySQL逆引きクイックリファレンス」(毎日 コミュニケーションズ)、「独習Java サーバサイド編」「Zend Framework徹底入門」(翔泳社)、「今日からつかえるPHP5サンプル集 PEAR&Zend Framework活用版」(秀和システム)、「書き込み式 SQLのドリル」(ソシム)など。最近では、雑誌/サイト記事の執筆/監修から講演までを広く手掛ける毎日である。 http://www.wings.msn.to/