Haskellには再帰的なディレクトリウォーカーがあるので、次のように書くことができます
listing <- walkDir "/tmp"
自分で書きたくない。cabal からいくつかの依存関係をインストールできますが、クロスプラットフォーム (少なくとも Linux と Windows) にしたいです。
Haskellには再帰的なディレクトリウォーカーがあるので、次のように書くことができます
listing <- walkDir "/tmp"
自分で書きたくない。cabal からいくつかの依存関係をインストールできますが、クロスプラットフォーム (少なくとも Linux と Windows) にしたいです。
隠しディレクトリ (名前が '.' で始まるディレクトリ) にない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 の両方で動作します。
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)
http://hackage.haskell.org/package/FilePatherには、そのような再帰的なディレクトリ ウォーキング機能があります。