directory-tree: A simple directory-like tree datatype, with useful IO functions

[ bsd3, data, library, system ] [ Propose Tags ]

A simple directory-like tree datatype, with useful IO functions and Foldable and Traversable instance

Provides a simple data structure mirroring a directory tree on the filesystem, as well as useful functions for reading and writing file and directory structures in the IO monad.

Importing the library and optional (useful) Foldable and Traverable libraries:

import System.Directory.Tree
import qualified Data.Foldable as F
import qualified Data.Traversable as T

Write a hand-made directory tree of textfiles (strings) to the disk. Simulates creating a new user Tux's home directory on a unix machine:

writeDirectory$ "/home" :/ Dir "Tux" [File "README" "Welcome!"]

"read" a directory by opening all the files at a filepath with readFile, returning an 'AnchoredDirTree String' (d2). Then check for any IO failures:

do (base :/ d2) <- readDirectory "../parent_dir/dir2/"
   let failed = anyFailed d2
   if failed then ...

Use Foldable instance function to concat a directory dir of text files into a single file under the same directory:

do (b :/ dt) <- readDirectory dir
   let f = F.concat dt
   return$ b :/ File "ALL_TEXT" f

Open all the files in the current directory as lazy bytestrings, ignoring the base path in Anchored wrapper:

import qualified Data.ByteString.Lazy as B
do (_ :/ dTree) <- readDirectoryWith B.readFile "./"

This version also offers an experimental function readDirectoryWithL that does lazy directory IO, allowing you to treat the returned DirTree as if it were a normal lazily-generated data structure.

For example, the following does only the amount of IO necessary to list the file names of the children of the root directory, similar to "ls /":

do d <- readDirectoryWithL readFile "/"
   mapM_ (putStrLn . name) $ contents $ free d

Any ideas or suggestions for improvements are most welcome :-)

CHANGES: from 0.11

  • export System.Directory.Tree.transformDir as requested

  • add test suite to cabal file

  • remove redundant removeNonexistent (thanks to dmwit for patch)




Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS] 0.1, 0.1.1, 0.1.2, 0.2.0, 0.2.1, 0.9.0, 0.9.1, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.12.1
Dependencies base (<5), directory (<2), filepath (<2) [details]
License BSD-3-Clause
Copyright (c) 2011, Brandon Simmons <>
Author Brandon Simmons
Maintainer Brandon Simmons <>
Category Data, System
Home page
Source repo head: git clone
Uploaded by BrandonSimmons at 2016-09-05T17:29:01Z
Distributions Debian:0.12.1, FreeBSD:0.12.0, LTSHaskell:0.12.1, NixOS:0.12.1, Stackage:0.12.1
Reverse Dependencies 19 direct, 202 indirect [details]
Downloads 36558 total (84 in the last 30 days)
Rating 2.25 (votes: 2) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2016-09-05 [all 1 reports]