19

Haskellには再帰的なディレクトリウォーカーがあるので、次のように書くことができます

listing <- walkDir "/tmp"

自分で書きたくない。cabal からいくつかの依存関係をインストールできますが、クロスプラットフォーム (少なくとも Linux と Windows) にしたいです。

4

4 に答える 4

13

隠しディレクトリ (名前が '.' で始まるディレクトリ) にないdirectory-treeを使用して、ディレクトリ ツリー内のすべての Haskell ファイルを一覧表示する 1 つの方法を次に示します。

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

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)
于 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 に答える