Copyright © 2020 TAKEHANA TADASHI
著作日時: 2020.02.14.金. 11:42:00 著作者、竹花 忠
指定フォルダ以下の全フォルダ内の全ファイル名をフルパスで取得する関数:
allfiles関数:
contentsは、指定されたフォルダ内のファイル名とフォルダ名のすべて。
filesは、contentsからファイル名だけをリストアップしたもの。
foldersは、contentsからフォルダ名だけをリストアップしたもの。
filessは、foldersが[]の時には[]となり次のreturnへ進む。
そして、filesとして、フォルダを含んでいなかった末端の階層のフォルダの全ファイル名、と、末端の階層なのでフォルダが存在していなくて、結果、concat filessとして[]、を連結してIOでくるんで返す。
その1段階手前のmapM allfiles foldersでは、そのfoldersの各フォルダについてその各フォルダ以下の全フォルダ内のすべてのファイル名がIOでくるまれて、各フォルダ分のすべてが返されてきて、そしてそれが、IOを外されて、その各フォルダ以下のファイル一覧から成るリストとしてfilessを得る。
そして次のreturnへ進む。
returnでは、先の、folders・各フォルダ、を含んでいたフォルダ内の全ファイル名、と、先のfilessを平らにしたものを連結して、IOでくるんで返す。
その段階手前のmapM allfiles folderでは、・・・・・
・
・
・
この繰り返しで、結局、最初に指定したフォルダ内の全ファイル名++そのフォルダ内の全フォルダ以下の全ファイル名、によって、最初に指定したフォルダ以下の全フォルダ内の全ファイル名が取得される。
allfiles :: String -> IO [String]
allfiles targetFolder = do
contents <- getDirectoryContents targetFolder
let
files = [targetFolder ++ "\\" ++ content | content <- contents, (notElem content [".", ".."]) && (elem '.' content)]
folders = [targetFolder ++ "\\" ++ content | content <- contents, notElem '.' content]
filess <- mapM allfiles folders
return $ files ++ (concat filess)