A simple directory-like tree datatype, with useful IO functions
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