Если у меня есть список FilePaths
, как я могу их фильтровать, чтобы возвращать только те, которые являются обычными файлами (а именно, не символическими ссылками или каталогами)?
Например, используя getDirectoryContents
main = do
contents <- getDirectoryContents "/foo/bar"
let onlyFiles = filterFunction contents in
print onlyFiles
где "filterFunction" - это функция, которая возвращает только FilePaths
, которые представляют файлы.
Ответ может просто работать на Linux, но поддержка кросс-платформы предпочтительнее.
[EDIT] Просто использование didDirectoryExist не работает должным образом. Этот script печатает список всего в каталоге, а не только файлы:
module Main where
import System.Directory
import Control.Monad (filterM, liftM)
getFiles :: FilePath -> IO [FilePath]
getFiles root = do
contents <- getDirectoryContents root
filesHere <- filterM (liftM not . doesDirectoryExist) contents
subdirs <- filterM doesDirectoryExist contents
return filesHere
main = do
files <- getFiles "/"
print $ files
Кроме того, переменные поддиры будут содержать только "."
и ".."
.