Haskell中是否有一些递归目录漫游器,所以我可以编写类似
的内容listing <- walkDir "/tmp"
我不想写自己的。我可以从cabal安装一些依赖项,但我希望它是跨平台的(至少Linux和Windows)。
答案 0 :(得分:12)
这是列出目录树中所有Haskell文件的一种方法,使用不在隐藏目录中的directory-tree(其名称以'。'开头):
import Data.Traversable (traverse)
import System.Directory.Tree (
AnchoredDirTree(..), DirTree(..),
filterDir, readDirectoryWith
)
import System.FilePath (takeExtension)
listFilesDirFiltered = do
_:/tree <- readDirectoryWith return "C:\\devmy\\code"
traverse print $ filterDir myPred tree
return ()
where myPred (Dir ('.':_) _) = False
myPred (File n _) = takeExtension n == ".hs"
myPred _ = True
main = listFilesDirFiltered
适用于Windows和Linux。
答案 1 :(得分:4)
http://hackage.haskell.org/package/FilePather具有这种递归目录行走功能。
答案 2 :(得分:3)
我有一个使用filepath包遍历目录的递归定义:
import Control.Monad
import System.Directory
import System.FilePath
import System.Posix.Files
-- | Traverse from 'top' directory and return all the files by
-- filtering out the 'exclude' predicate.
traverseDir :: FilePath -> (FilePath -> Bool) -> IO [FilePath]
traverseDir top exclude = do
ds <- getDirectoryContents top
paths <- forM (filter (not.exclude) ds) $ \d -> do
let path = top </> d
s <- getFileStatus path
if isDirectory s
then traverseDir path exclude
else return [path]
return (concat paths)
答案 3 :(得分:2)