Haskell中是否有目录遍历器?

19

在Haskell中是否有一些递归目录遍历器,这样我就可以编写类似以下的代码:

listing <- walkDir "/tmp"

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


我编写了dir-tree包,应该很容易定义一个惰性的walkDir,例如使用Foldable实例提供的toList - jberryman
4个回答

13

以下是一种列出目录树中所有非隐藏的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上运行。


这只是库中定义的构造函数:http://hackage.haskell.org/packages/archive/directory-tree/0.11.0/doc/html/System-Directory-Tree.html - Mateusz Kowalczyk
1
我比起被接受的答案更喜欢这个库——它更简单,依赖更少,但同样强大。它也与 lens 兼容,但如果你不使用 lens,它不会依赖于(庞大的)lens 库。这是主要的 Hackage 页面链接:directory-tree [编辑:但别误解;FilePather 也很棒] - Yitz

7

我有一个使用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)

谢谢@StephaneRolland。 - aycanirican

5

有没有这个库的教程?它看起来不是很容易。 - Trismegistos
我在 https://github.com/singpolyma/imapmd 中使用了它,但只使用了 hackage 上呈现的文档。 - singpolyma

2
filemanip 包提供了强大而优雅的函数来实现这一点。例如,它提供了一个fold 函数,可以递归调用您的函数来遍历整个目录树。我在这里使用它来从最老的文件开始递归列出目录中的文件。

2
@Trismegistos 在源代码中有一些例子(http://hackage.haskell.org/package/filemanip-0.3.6.2/docs/src/System-FilePath-Find.html),但毫无疑问,Haskell库在实际应用和教程方面的文档往往不够充足。我经常发现,在ghci中乱搞比阅读文档更有帮助。 - Daniel Lyons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接