Haskell中有一些目录漫游器吗?

Tri*_*tos 17 io haskell directory-traversal

在Haskell中是否有一些递归目录walker所以我可以编写类似的东西

listing <- walkDir "/tmp"
Run Code Online (Sandbox Code Playgroud)

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

Bjö*_*ist 13

这里有一种方法可以列出一个目录树中的所有哈斯克尔文件,使用目录树,是不是在一个隐藏目录(其名以""):

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
Run Code Online (Sandbox Code Playgroud)

适用于Windows和Linux.

  • 天哪!什么是_:/树? (2认同)

ayc*_*can 6

我有一个使用 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)
Run Code Online (Sandbox Code Playgroud)


sin*_*yma 5

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