如何获取目录中的目录列表?
我想出了下面的内容,但我希望有更优雅的方式:
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
答案 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)