Haskell在目录中获取目录

时间:2017-05-20 14:00:26

标签: haskell

如何获取目录中的目录列表?

我想出了下面的内容,但我希望有更优雅的方式:

import System.Directory
import qualified Filesystem.Path as FsP
import Filesystem.Path.CurrentOS
import Control.Monad

getDirectories :: Prelude.FilePath -> IO [Prelude.FilePath]
getDirectories x = do
  listDirectory x
  >>= (return . fmap decodeString)
  >>= return . fmap (FsP.append (decodeString x))
  >>= (return . fmap encodeString)
  >>= filterM doesDirectoryExist

2 个答案:

答案 0 :(得分:6)

您似乎正在使用已弃用的软件包system-filepath,而是使用filepath软件包:

import           Control.Monad    (filterM)
import           System.Directory (doesDirectoryExist, listDirectory)
import           System.FilePath  ((</>))

getDirectories :: FilePath -> IO [FilePath]
getDirectories filePath = do
  allFiles <- listDirectory filePath
  filterM (doesDirectoryExist . (filePath </>)) allFiles

或者如果您更喜欢显式使用bind运算符:

import           Control.Monad    (filterM)
import           System.Directory (doesDirectoryExist, listDirectory)
import           System.FilePath  ((</>))

getDirectories :: FilePath -> IO [FilePath]
getDirectories filePath = listDirectory filePath
                      >>= filterM (doesDirectoryExist . (filePath </>))

注意:您的函数版本将返回列表中每个输出目录前面的输入文件路径。虽然这可能是你想要的,但我给你的getDirectories版本可能更通用,因为它的行为与listDirectory完全相同,只是修剪文件/可执行文件。

编辑:将导入从System.FilePath.Posix更改为System.FilePath,以实现真正的平台独立性。感谢Justin Raymond提出建议。

答案 1 :(得分:3)

您需要的只是System.Directory

import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory, getDirectoryContents)

listDirs :: IO [FilePath]
listDirs = getCurrentDirectory >>= getDirectoryContents >>= filterM doesDirectoryExist

如果要将文件路径作为参数传递,请不要使用getCurrentDirectory

import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory)

listDirs :: FilePath -> IO [FilePath]
listDirs path = getDirectoryContents path >>= filterM (doesDirectoryExist . (++) path)