Содержимое каталога в Haskell - PullRequest
15 голосов
/ 20 декабря 2011

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

Когда я делаю

getDirectoryContents dir

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

Ответы [ 2 ]

16 голосов
/ 20 декабря 2011
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. (</>) и может быть немного быстрее.

3 голосов
/ 20 декабря 2011
import System.Directory (getDirectoryContents)
import System.FilePath ((</>))

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