[Haskell] Reading a directory tree
Glynn Clements
glynn.clements at virgin.net
Tue Jun 22 11:38:14 EDT 2004
Tom Hofte wrote:
> I'm looking for a way to iteratively read all the files in a directory
> and
> its subdirectories, given the filepath of the top-level dir.
> For example, I want to find a file, corresponding to a given filename,
> in a directory and its subdirectories.
>
> Is there a way to implement this in Haskell?
This is somewhat simpler than the other examples which have been
given.
> import Monad
> import Directory
>
> scanDir :: FilePath -> IO [FilePath]
> scanDir dir = do
> names <- getDirectoryContents dir
> let names' = filter ((/= '.') . head) names
> let paths = map ((dir ++ "/") ++) names'
> dirs <- filterM doesDirectoryExist paths
> files <- filterM doesFileExist paths
> rest <- mapM scanDir dirs
> return $ files ++ concat rest
One caveat: (scanDir "/") isn't handled correctly; you will get an
extra slash, i.e. "//usr", "//bin" etc. Not that I'd recommend using
this code for scanning an entire filesystem, due to performance
issues.
--
Glynn Clements <glynn.clements at virgin.net>
More information about the Haskell
mailing list