3.3 フォルダの中を下の階層まで探る
 フォルダに入っている全てのファイルの情報を得るときの方法です。もちろん、下の階層に入っているファイルも全て検索し、全ファイルの合計サイズやファイル数、フォルダ数まで取得する方法です。
使用例
 使用するオブジェクトやメソッドは基本的に3.2 フォルダの中を探ると同じです。

 大きく違う部分は、フォルダの内容を探る部分(ForNext)をSubプロシジャ(prcFolderSize)にした所と、フォルダアイテムオブジェクトから取り出したアイテムがフォルダだったときに、そのアイテムをGetFolderメソッドでフォルダオブジェクトに変え、さらにそこからItemsメソッドでフォルダアイテムオブジェクトを取り出し、そして、そのフォルダにさらに探りを入れるために、取り出したフォルダアイテムオブジェクトをパラメタとして、さらにprcFolderSizeを呼び出している所。
 このようにすると、検索の先頭になるフォルダ以下の全てのフォルダに探りを入れることが可能です。ちなみに、自分自身をさらに呼び出すことを再帰呼び出しといいます。

 再帰呼び出しで処理を行うことにより、いずれは先頭のフォルダ以降の全てのファイルとフォルダが処理されるので、ファイルの時はサイズと個数の集計、フォルダのときは個数の集計(もちろん、そのフォルダの探りも)を行えば、総容量や総ファイル数を取得できます。

 でも、なぜか特定のファイル(拡張子がvxdなど)の情報だけ取れないのです。情報が取れないと言うより、最初からアイテムとして入ってこないんですよ(泣)。なぜなのでしょう…だから「約xxxバイト」なのです(汗)

 ■VBScriptの記述例
Option Explicit

Dim objApl
Dim objFolder
Dim objFolderItems
Dim numFolderSize
Dim numFileCount
Dim numFolderCount

numFolderSize=0
numFileCount=0
numFolderCount=0

'@シェルアプリケーションオブジェクトを作成します
Set objApl = WScript.CreateObject("Shell.Application")

'A探りを入れたいフォルダのオブジェクトを作成します
Set objFolder = objApl.NameSpace("C:\happy")

'Bフォルダオブジェクトから、入っているファイルや
' フォルダの情報を取得します
Set objFolderItems = objFolder.Items()

'フォルダの検索処理の呼び出し
Call prcFolderSize (objFolderItems)

'結果の表示。総容量、総ファイル数、総フォルダ数を表示
WScript.Echo "フォルダC:\happyの容量は、約" & numFolderSize & "バイトです"
WScript.Echo "フォルダC:\happyのファイル数は、約" & numFileCount & "個です"
WScript.Echo "フォルダC:\happyのフォルダ数は、約" & numFolderCount & "個です"

Set objFolderItems = Nothing
Set objFolder = Nothing
Set objApl = Nothing

'==============================================================
'= フォルダ内に含まれるファイルやフォルダを検索する
'==============================================================
Sub prcFolderSize(tmpFolderItems)

    Dim objFolderItemsB
    Dim objItem
    Dim i

    'C何個入っていたかは、Countで参照
    For i=0 To tmpFolderItems.Count-1

        'Dファイルやフォルダの情報を1コ取り出します
        Set objItem = tmpFolderItems.Item(i)

        'E取り出した物がファイルかフォルダかを判定
        If objItem.IsFolder Then
           'Fフォルダであれば、フォルダアイテムオブジェクトを
           ' 作り、それを引数としてprcFolderSizeを再帰呼び出します
           Set objFolderItemsB = objItem.GetFolder
           Call prcFolderSize (objFolderItemsB.Items())
           numFolderCount = numFolderCount + 1
        Else
           'Gファイルの場合は、サイズとファイル数を集計します
           numFolderSize = numFolderSize + objItem.Size
           numFileCount = numFileCount + 1
        End If

    Next

    Set objItem = Nothing
    Set objFolderItemsB = Nothing

End Sub

 ■JScript(JavaScript)の記述例
var objApl;
var objFolder;
var objFolderItems;
var numFolderSize;
var numFileCount;
var numFolderCount;

numFolderSize=0;
numFileCount=0;
numFolderCount=0;

//@シェルアプリケーションオブジェクトを作成します
objApl = WScript.CreateObject("Shell.Application");

//A探りを入れたいフォルダのオブジェクトを作成します
objFolder = objApl.NameSpace("C:\\happy");

//Bフォルダオブジェクトから、入っているファイルや
// フォルダの情報を取得します
objFolderItems = objFolder.Items();

//フォルダの検索処理の呼び出し
prcFolderSize(objFolderItems);

//結果の表示。総容量、総ファイル数、総フォルダ数を表示
WScript.echo("フォルダC:\\happyの容量は、約" + numFolderSize + "バイトです");
WScript.echo("フォルダC:\\happyのファイル数は、約" + numFileCount + "個です");
WScript.echo("フォルダC:\\happyのフォルダ数は、約" + numFolderCount + "個です");

objFolderItems = null;
objFolder = null;
objApl = null;

//==============================================================
//= フォルダ内に含まれるファイルやフォルダを検索する
//==============================================================
function prcFolderSize(tmpFolderItems) {

    var objFolderItemsB;
    var objItem;
    var i;

    //C何個入っていたかは、Countで参照
    for (i=0;i
        //Dファイルやフォルダの情報を1コ取り出します
        objItem = tmpFolderItems.Item(i);

        //E取り出した物がファイルかフォルダかを判定
        if (objItem.IsFolder==true) {
           //Fフォルダであれば、フォルダアイテムオブジェクトを
           // 作り、それを引数としてprcFolderSizeを再帰呼び出します
           objFolderItemsB = objItem.GetFolder;
           prcFolderSize(objFolderItemsB.Items());
           numFolderCount++;
        } else {
           //Gファイルの場合は、サイズとファイル数を集計します
           numFolderSize+=objItem.Size;
           numFileCount++;
        }

    }

    objItem = null;
    objFolderItemsB = null;

}
Copyright(C) 1999-2006 結城圭介。 All rights reserved