Содержимое каталога в Haskell

Есть ли способ вернуть список файлов в каталоге с их абсолютными путями.

Когда я делаю

getDirectoryContents dir

он дает мне список имен файлов в каталоге. Если я использую эти имена файлов в другом месте, мне нужно знать их абсолютные пути или пути относительно текущего рабочего каталога.

Ответы

Ответ 1

getAbsDirectoryContents :: FilePath -> IO [FilePath]
getAbsDirectoryContents dir =
  getDirectoryContents dir >>= mapM (canonicalizePath . (dir </>))

Это использует System.Directory.canonicalizePath и работает, даже если dir не является абсолютным путем (например, если вы вызываете getAbsDirectoryContents "foo" а затем переместить в другое место в файловой системе).

Если вы знаете, что dir - это абсолютный путь, вы можете использовать:

getAbsDirectoryContents :: FilePath -> IO [FilePath]
getAbsDirectoryContents dir = map (dir </>) <$> getDirectoryContents dir

который использует System.FilePath. (</gt) и может быть немного быстрее.

Ответ 2

import System.Directory (getDirectoryContents)
import System.FilePath ((</>))

getAbsoluteDirContents :: String -> IO [FilePath]
getAbsoluteDirContents dir = do
  contents <- getDirectoryContents dir
  return $ map (dir </>) contents