(1/2)FileSystemObjectを利用したWSHからのファイル操作法。今回はフォルダの操作とドライブの操作について解説する。WSHからのファイル操作(2)これまではファイルの操作について説明してきた。次に以下では、フォルダの操作方法について説明しよう。処理方法もファイルに対するものと同様に、FSOオブジェクトを直接利用する方法と、Folderオブジェクトを作成して利用する方法の2種類が提供されている。FSOオブジェクトを使用する方法を述べてから、Folderオブジェクトを使用する方法について述べることにする。以下はFSOオブジェクトのメソッドのうち、フォルダに関係するものの一覧である。メソッド機能CopyFolderメソッドフォルダをコピーするMoveFolderメソッドフォルダを移動するDeleteFolderメソッドフォルダを削除するFolderExistsメソッドフォルダが存在するかどうかを調べるCreateFolderメソッドフォルダを作成するGetFolderメソッドFolderオブジェクトを返すGetSpecialFolderメソッド特殊フォルダのFolderオブジェクトを返すフォルダのコピーフォルダのコピーにはCopyFolderメソッドを用いる。CopyFolderメソッドにコピー元のフォルダ名とコピー先のフォルダ名を渡すことで、フォルダをコピーできる。この場合、フォルダに含まれるファイルやサブフォルダもコピーされる。通常、コピー先にすでにフォルダがある場合は既存フォルダ内のファイルが上書きされるが、第3パラメータにFalseを指定することで、ファイルを上書きせずにエラーを発生させることができる。overwrite]コピー先文字列が「\」で終わる場合には、指定したフォルダの直下に元と同じフォルダ名でフォルダがコピーされる。ない場合、指定したフォルダ名でコピー先のフォルダが作成される。次のコードの1行目では「D:\WSH\Folder2」というフォルダが作成され、2行目では「D:\WSH\Folder2\Folder1」というフォルダが作成される。"D:\WSH\Folder2\"コピー元フォルダ名にはワイルドカードを指定することもできる。ワイルドカードを指定できるのは最後の「\」記号以降の、実際にコピーを行うフォルダ名のみで、パス部分には指定できない。ワイルドカードを指定した場合には複数のフォルダがコピーされる可能性があるので、コピー先は常に既存フォルダ名であると認識される。ワイルドカードで指定したコピー元フォルダ名に一致するフォルダがなかった場合には、エラーが発生する。フォルダの移動フォルダの移動にはMoveFolderメソッドを用いる。destinationCopyFolderメソッドと同じように、コピー先文字列が「\」で終わる場合には、指定したフォルダの直下に元と同じフォルダ名でフォルダがコピーされる。ない場合、指定したフォルダ名でコピー先のフォルダが作成される。移動先にすでに同名のフォルダが存在する場合にはエラーが発生する。移動元のフォルダ名の指定には、ワイルドカードを使用できる。フォルダの削除フォルダの削除にはDeleteFolderメソッドを用いる。この際、フォルダ内にファイルやサブフォルダがある場合には、それらも削除される。通常は読み取り専用属性を持つフォルダは削除しないが、第2パラメータにTrueを指定すると読み取り専用属性を持つフォルダも削除できる。削除するフォルダ名にはワイルドカードを利用できる。force]フォルダが存在するかどうかを調査するFolderExistsメソッドは、フォルダが存在する場合にTrueを、存在しない場合にFalseを返すメソッドである。objFSO.FolderExists(folderspec)フォルダを作成するCreateFolderメソッドは、フォルダを作成するメソッドである。指定したフォルダがすでに存在していた場合や、親フォルダが存在しない場合にはエラーが発生する。CreateFolderメソッドは戻り値として後述するFolderオブジェクトを返す。CreateFolderメソッドやCreateTextFileメソッドは、親フォルダが存在しないとエラーが発生する。自動的に必要なフォルダを作成するには、以下のようなプロシージャを定義すればよい。NowGetParentFolderNameメソッドは、フォルダ名やファイル名に対し、その親フォルダの名前を返すメソッドである。CreateFolder2プロシージャでは、親フォルダが存在しなければ、再帰的に親フォルダを作成した後、指定されたフォルダを作成する。CreateTextFile2プロシージャは、親フォルダが存在しなければ親フォルダを作成した後に通常のCreateTextFileを呼び出す。これらの処理により、18行目では、必要に応じてFolder1、Folder2が作成された後、Test.txtが作られる。特殊フォルダの取得WSHでは、特殊フォルダを取得する方法として、WshShellオブジェクトのSpecialFoldersプロパティやExpandEnvironmentStringsメソッドが用意されている(これらの詳細については連載第6回を参照)。FSOオブジェクトのGetSpecialFolderメソッドを使うことでも、Windowsフォルダ、Systemフォルダ、Tempフォルダの3種類の特殊フォルダを取得することができる。GetSpecialFolderメソッドでは、どの特殊フォルダを取得するかを整数値で指定する。具体的には、Windowsフォルダは0、Systemフォルダは1、Tempフォルダは2を指定する。GetSpecialFolderメソッドは、フォルダ名ではなく、Folderオブジェクトを返す。次の例では、取得したFolderオブジェクトのPathプロパティの値を表示している。specialfolder.vbsC:\WINDOWSC:\WINDOWS\system32C:\DOCUME~1\tomo-k\LOCALS~1\TempD:\WSH>FolderオブジェクトFolderオブジェクトは、フォルダを表すオブジェクトである。このオブジェクトを利用して、フォルダのコピーや移動、削除、フォルダの持つ属性の取得、設定ができるほか、フォルダ内のファイルやサブフォルダを列挙することができる。Folderオブジェクトフォルダのコピーや削除、属性の取得/設定が行える。Folderオブジェクトを取得するには、FSOオブジェクトのGetFolderメソッド、GetSpecialFolderメソッド、CreateFolderメソッド、FileオブジェクトのParentFolderプロパティ、Folderオブジェクト自身が持つParentFolderプロパティやSubFoldersプロパティ、後述するDriveオブジェクトのRootFolderプロパティを利用する。フォルダ名が分かっている場合には、これらのうちGetFolderメソッドが利用できる。「D:\WSH」というフォルダを表すFolderオブジェクトを取得するには次のようにする。")Folderオブジェクトには、以下のメソッド・プロパティがある。メソッド/プロパティ機能CopyメソッドフォルダをコピーするDeleteメソッドフォルダを削除するMoveメソッドフォルダを移動するAttributesプロパティ属性を取得・設定するDateCreatedプロパティ作成日時を取得するDateLastAccessedプロパティ最終アクセス日時を取得するDateLastModifiedプロパティ最終更新日時を取得するDriveプロパティフォルダの格納されているドライブを表すDriveオブジェクトを取得するFilesプロパティフォルダ内のファイルのコレクションを返すIsRootFolderプロパティルートフォルダであればTrueを返すNameプロパティフォルダの名前を取得・設定するParentFolderプロパティ親フォルダを表すFolderオブジェクトを取得するPathプロパティフォルダのパスを取得するShortNameプロパティMS-DOS形式のフォルダ名を取得するShortPathプロパティMS-DOS形式のパスを取得するSizeプロパティフォルダの合計サイズを取得するSubFoldersプロパティサブフォルダのコレクションを返すTypeプロパティフォルダの種類を取得するこれらのメソッド/プロパティは、ほとんどがFileオブジェクトと共通のものであり、使い方もFileオブジェクトの場合と違いはない。Fileオブジェクトと異なるプロパティは、Filesプロパティ、SubFoldersプロパティ、IsRootFolderプロパティの3つのみである。ここではこれらFolderオブジェクト特有のプロパティについて解説する。■Files/SubFolders/IsRootFolderプロパティFilesプロパティはフォルダ内のファイルの一覧を取得するプロパティであり、SubFoldersプロパティはサブフォルダの一覧を取得するプロパティである。この2つのプロパティを活用することで、フォルダの階層構造をたどりながら処理をすることが可能となる。典型的な利用法は、特定のフォルダの中にあるすべてのファイルの処理だろう。特定のフォルダ直下にあるファイルはFilesプロパティで取得できるし、サブフォルダ内のファイルを取得するには、SubFoldersプロパティで取得できるすべてのサブフォルダのFilesプロパティを確認すればよい。FilesプロパティやSubFoldersプロパティはコレクション・オブジェクトを返す。コレクション・オブジェクトのCountプロパティにより個数を取得することができる。ほかのコレクション同様、Itemプロパティも用意されているが、連番ではなく、ファイル名やフォルダ名をItemプロパティに渡すことで、対応するFileオブジェクトやFolderオブジェクトが得られるという仕組みになっており、ファイル名/フォルダ名にかかわらず、すべての要素を処理したい場合には、Itemプロパティは利用できない。JScriptでは、Enumeratorオブジェクトを用いてすべての要素にアクセスする。次の例では、特定のフォルダ内のファイルの一覧とサブフォルダの一覧を表示する。Next実行すると次のようにファイルとサブフォルダが表示される。files.vbsD:\WSH\Folder1内のファイル:Test1.txtTest2.txtTest3.txtD:\WSH\Folder1内のサブフォルダ:SubFolder1SubFolder2D:\WSH>サブフォルダ内も含めて特定のフォルダ内のすべてのファイルを処理するには、次のようにプロシージャを作り、再帰的に処理を行うようにする。この例では「D:\WSH\Folder1」以下のすべてのファイルの読み取り専用属性を解除する。TurnOffReadOnly(objFolder)IsRootFolderプロパティはFolderオブジェクトがルートフォルダであればTrueを、そうでなければFalseを返す。次の例では、親フォルダを順に列挙する。"(ルートフォルダ)"実行するとobjFolderがルートフォルダとなるまで繰り返され、次のように表示される。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。