本ページには広告が含まれています。
サブフォルダを含めたファイル一覧を配列で返します。第二引数以降は処理をする際に必要なだけの引数のため指定する必要はありません。
- 構文
- Array = getFileList( folderspec, TextStream, filename, bool )
- 引数
- folderspec 必須
- フォルダのパス
- TextStream 省略可
- TextStreamオブジェクト
- filename 省略可
- 一時ファイル名
- bool 省略可
- 再帰呼び出しの深さが最上部かを表すブール値
- 戻り値
プログラム
//////////////////////////////////////////////////
// 【引数】
// folderspec : フォルダのパス
// TextStream : TextStreamオブジェクト
// filename : 一時ファイル名
// bool : 再帰呼び出しの深さが最上部かを表すブール値
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION getFileList(folderspec, TextStream = NOTHING, filename = "", bool = TRUE)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
IFB TextStream = NOTHING THEN
CONST TemporaryFolder = 2
DIM TempFolder = FSO.GetSpecialFolder(TemporaryFolder)
DIM TempFolderspec = TempFolder.Path
DIM name = FSO.GetTempName
filename = FSO.BuildPath(Tempfolderspec, name)
TextStream = FSO.CreateTextFile(filename)
ENDIF
DIM Folder = FSO.GetFolder(folderspec)
DIM Folders = Folder.SubFolders
FOR Folder IN Folders
getFileList(Folder.Path, TextStream, filename, FALSE)
FOR File IN Folder.Files
TextStream.WriteLine(File.Path)
NEXT
NEXT
IFB bool THEN
TextStream.Close
TextStream = FSO.OpenTextFile(filename)
DIM str = TextStream.ReadAll
TextStream.Close
FSO.DeleteFile(filename)
RESULT = SPLIT(str, "<#CR>")
ENDIF
FEND
解説
- 2行目
- FileSystemObject オブジェクトを生成しFSOに代入します。
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
- 3,10行目
- TextStreamがNothingなら4行目>>>。
IFB TextStream = NOTHING THEN … ENDIF
- 4-8行目
- TempフォルダのFolderオブジェクトをTempFolder、パスをTempFolderspecに代入します。ランダムに生成した一時ファイル名をname、フォルダ名と繋げたフルパスをfilenameに代入します。
CONST TemporaryFolder = 2 DIM TempFolder = FSO.GetSpecialFolder(TemporaryFolder) DIM TempFolderspec = TempFolder.Path DIM name = FSO.GetTempName filename = FSO.BuildPath(Tempfolderspec, name)
- 9行目
- filenameで指定したパスでTextStreamオブジェクトを生成し、TextStreamに代入します。このテキストファイルにリストアップしたファイル名を一時的に格納します。
TextStream = FSO.CreateTextFile(filename)
- 11行目
- folderspecのFolderオブジェクトを生成しFolderに代入します。
DIM Folder = FSO.GetFolder(folderspec)
- 12行目
- 指定したフォルダに含まれるすべてのフォルダから構成されるFoldersコレクションを取得しFoldersに代入します。
DIM Folders = Folder.SubFolders
- 13,18行目
- Foldersコレクションに含まれるすべてのFolderオブジェクトにアクセスします。
FOR Folder IN Folders … NEXT
- 14行目
- 現在のフォルダから下層のフォルダを取得するため再帰呼び出しする。
getFileList(Folder.Path, TextStream, filename, FALSE)
- 15-17行目
- Folderオブジェクトに含まれるファイルの一覧を取得し、テキストファイルに書き込みます。
FOR File IN Folder.Files TextStream.WriteLine(File.Path) NEXT
- 19-26行目
- 再帰呼び出しの最上部ならば20行目>>>。14行目>>>で再帰呼び出しする際第四引数のboolにFalseを指定しているので、このIF文でTrueと判定された場合は最上部ということになり、すべてのサブフォルダ・ファイルにアクセスしたことになります。
IFB bool THEN TextStream.Close TextStream = FSO.OpenTextFile(filename) DIM str = TextStream.ReadAll TextStream.Close FSO.DeleteFile(filename) RESULT = SPLIT(str, "<#CR>") ENDIF
- 20行目
- テキストファイルを一旦閉じ、内容を保存します。
TextStream.Close
- 21-23行目
- 再度テキストファイルを開き、内容をstrに代入します。
TextStream = FSO.OpenTextFile(filename) DIM str = TextStream.ReadAll TextStream.Close
- 24行目
- filenameのテキストファイルを削除します。
FSO.DeleteFile(filename)
- 25行目
- strの内容を改行文字で区切り配列にし返します。一行毎にフォルダ名・ファイル名が記述されているので、配列の各要素にフォルダ名・ファイル名が格納されていることになります。
RESULT = SPLIT(str, "<#CR>")
プログラム実行例
全ファイルをサブフォルダから直下に取り出す
D:\Pictures\100ANDRO\より下層フォルダにあるファイルを直下に移動させます。ファイル名が重複する場合は - コピー、 - コピー (2)のような連番をつけて変更されます。
空になったフォルダを削除するにはdeleteEmptyFoldersを使います。
CONST FOF_RENAMEONCOLLISION = 8
DIM folderspec = "D:\Pictures\100ANDRO\"
DIM array = getFileList(folderspec)
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(folderspec)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
FOR item IN array
IF FSO.FolderExists(item) THEN CONTINUE
PRINT Folder.Self.Path
PRINT item
Folder.MoveHere(item, FOF_RENAMEONCOLLISION)
NEXT
//////////////////////////////////////////////////
// 【引数】
// folderspec : フォルダのパス
// TextStream : TextStreamオブジェクト
// filename : 一時ファイル名
// bool : 再帰呼び出しの深さが最上部かを表すブール値
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION getFileList(folderspec, TextStream = NOTHING, filename = "", bool = TRUE)
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
IFB TextStream = NOTHING THEN
CONST TemporaryFolder = 2
DIM TempFolder = FSO.GetSpecialFolder(TemporaryFolder)
DIM TempFolderspec = TempFolder.Path
DIM name = FSO.GetTempName
filename = FSO.BuildPath(Tempfolderspec, name)
TextStream = FSO.CreateTextFile(filename)
ENDIF
DIM Folder = FSO.GetFolder(folderspec)
DIM Folders = Folder.SubFolders
FOR Folder IN Folders
getFileList(Folder.Path, TextStream, filename, FALSE)
FOR File IN Folder.Files
TextStream.WriteLine(File.Path)
NEXT
NEXT
IFB bool THEN
TextStream.Close
TextStream = FSO.OpenTextFile(filename)
DIM str = TextStream.ReadAll
TextStream.Close
FSO.DeleteFile(filename)
RESULT = SPLIT(str, "<#CR>")
ENDIF
FEND
使用関数
関連記事
- Shell.Explore メソッド
- 指定したディレクトリをエクスプローラで開きます。
- Folder オブジェクト
- フォルダのすべてのプロパティにアクセスできます。
- CreateFolders関数 (自作関数)
- FSO.CreateFolderの改良版。親フォルダが存在しなくてもフォルダを作成できます。
- Folder.CopyHere メソッド (Shell)
- 1つまたは複数のアイテムをフォルダにコピーします。
- Folder.MoveHere メソッド (Shell)
- 1つまたは複数のアイテムをこのフォルダに移動します。
- FileSystemObject オブジェクト
- DELETEFILE関数 (スクリプト関数)
- テキストファイルを削除します。
- FCLOSE関数 (スクリプト関数)
- テキストファイルを閉じます。
- FGET関数 (スクリプト関数)
- テキストファイルの読み込みを行います。
- GETDIR関数 (スクリプト関数)