19

Haskell 中是否有一些递归目录遍历器,所以我可以写类似的东西

listing <- walkDir "/tmp"

我不想自己写。我可以从 cabal 安装一些依赖项,但我希望它是跨平台的(至少是 Linux 和 Windows)。

4

4 回答 4

13

这是列出目录树中所有 Haskell 文件的一种方法,使用不在隐藏目录中的目录树(其名称以 '.' 开头)

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。

于 2012-11-15T11:47:00.643 回答
7

我有一个使用文件路径包遍历目录的递归定义:

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)
于 2014-05-23T06:59:09.020 回答
5

http://hackage.haskell.org/package/FilePather具有那种递归目录遍历功能。

于 2012-11-08T21:16:23.963 回答
2

filemanip软件包为此提供了强大而优雅的功能。例如,它提供了一个fold函数,该函数将在目录树中递归调用您的函数。作为一个例子,我在这里使用它来递归地列出目录中的文件,从最旧的开始

于 2014-05-22T22:10:59.533 回答