getFileList関数

本ページには広告が含まれています。

サブフォルダを含めたファイル一覧を配列で返します。第二引数以降は処理をする際に必要なだけの引数のため指定する必要はありません。

構文
  1. Array = getFileList( folderspec, TextStream, filename, bool )
引数
folderspec 必須
フォルダのパス
TextStream 省略可
TextStreamオブジェクト
filename 省略可
一時ファイル名
bool 省略可
再帰呼び出しの深さが最上部かを表すブール値
戻り値

プログラム

UWSC
//////////////////////////////////////////////////
// 【引数】
//   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

解説

  1. 2行目
    UWSC
    	DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
    FileSystemObject オブジェクトを生成しFSOに代入します。
  2. 3,10行目
    UWSC
    	IFB TextStream = NOTHING THEN
    		…
    	ENDIF
    TextStreamがNothingなら4行目>>>
  3. 4-8行目
    UWSC
    		CONST TemporaryFolder = 2
    	 	DIM TempFolder = FSO.GetSpecialFolder(TemporaryFolder)
    		DIM TempFolderspec = TempFolder.Path
    		DIM name = FSO.GetTempName
    		filename = FSO.BuildPath(Tempfolderspec, name)
    TempフォルダのFolderオブジェクトをTempFolder、パスをTempFolderspecに代入します。ランダムに生成した一時ファイル名をname、フォルダ名と繋げたフルパスをfilenameに代入します。
  4. 9行目
    UWSC
    		TextStream = FSO.CreateTextFile(filename)
    filenameで指定したパスでTextStreamオブジェクトを生成し、TextStreamに代入します。このテキストファイルにリストアップしたファイル名を一時的に格納します。
  5. 11行目
    UWSC
    	DIM Folder = FSO.GetFolder(folderspec)
    folderspecのFolderオブジェクトを生成しFolderに代入します。
  6. 12行目
    UWSC
    	DIM Folders = Folder.SubFolders
    指定したフォルダに含まれるすべてのフォルダから構成されるFoldersコレクションを取得しFoldersに代入します。
  7. 13,18行目
    UWSC
    	FOR Folder IN Folders
    		…
    	NEXT
    Foldersコレクションに含まれるすべてのFolderオブジェクトにアクセスします。
  8. 14行目
    UWSC
    		getFileList(Folder.Path, TextStream, filename, FALSE)
    現在のフォルダから下層のフォルダを取得するため再帰呼び出しする。
  9. 15-17行目
    UWSC
    		FOR File IN Folder.Files
    			TextStream.WriteLine(File.Path)
    		NEXT
    Folderオブジェクトに含まれるファイルの一覧を取得し、テキストファイルに書き込みます。
  10. 19-26行目
    UWSC
    	IFB bool THEN
    		TextStream.Close
    		TextStream = FSO.OpenTextFile(filename)
    		DIM str = TextStream.ReadAll
    		TextStream.Close
    		FSO.DeleteFile(filename)
    		RESULT = SPLIT(str, "<#CR>")
    	ENDIF
    再帰呼び出しの最上部ならば20行目>>>14行目>>>で再帰呼び出しする際第四引数のboolにFalseを指定しているので、このIF文でTrueと判定された場合は最上部ということになり、すべてのサブフォルダ・ファイルにアクセスしたことになります。
  11. 20行目
    UWSC
    		TextStream.Close
    テキストファイルを一旦閉じ、内容を保存します。
  12. 21-23行目
    UWSC
    		TextStream = FSO.OpenTextFile(filename)
    		DIM str = TextStream.ReadAll
    		TextStream.Close
    再度テキストファイルを開き、内容をstrに代入します。
  13. 24行目
    UWSC
    		FSO.DeleteFile(filename)
    filenameのテキストファイルを削除します。
  14. 25行目
    UWSC
    		RESULT = SPLIT(str, "<#CR>")
    strの内容を改行文字で区切り配列にし返します。一行毎にフォルダ名・ファイル名が記述されているので、配列の各要素にフォルダ名・ファイル名が格納されていることになります。

プログラム実行例

全ファイルをサブフォルダから直下に取り出す

D:\Pictures\100ANDRO\より下層フォルダにあるファイルを直下に移動させます。ファイル名が重複する場合は - コピー - コピー (2)のような連番をつけて変更されます。

空になったフォルダを削除するにはdeleteEmptyFoldersを使います。

UWSC
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関数 (スクリプト関数)