extra-0.3: src/System/Directory/Extra.hs
{-# LANGUAGE CPP #-}
module System.Directory.Extra(
module System.Directory,
withCurrentDirectory, getDirectoryContentsRecursive, createDirectoryPrivate
) where
import System.Directory
import Control.Monad.Extra
import System.FilePath
import Data.List
import Control.Exception
#ifndef mingw32_HOST_OS
import qualified System.Posix
#endif
-- | Remember that the current directory is a global variable, so calling this function
-- multithreaded is almost certain to go wrong. Avoid changing the dir if you can.
withCurrentDirectory :: FilePath -> IO a -> IO a
withCurrentDirectory dir act =
bracket getCurrentDirectory setCurrentDirectory $ const $ do
setCurrentDirectory dir; act
-- | Find all the files within a directory, including recursively.
-- Looks through all folders, including those beginning with @.@.
getDirectoryContentsRecursive :: FilePath -> IO [FilePath]
getDirectoryContentsRecursive dir = do
xs <- getDirectoryContents dir
(dirs,files) <- partitionM doesDirectoryExist [dir </> x | x <- xs, not $ all (== '.') x]
rest <- concatMapM getDirectoryContentsRecursive $ sort dirs
return $ sort files ++ rest
-- | Create a directory with permissions so that only the current user can view it.
-- On Windows this function is equivalent to 'createDirectory'.
createDirectoryPrivate :: String -> IO ()
#ifdef mingw32_HOST_OS
createDirectoryPrivate s = createDirectory s
#else
createDirectoryPrivate s = System.Posix.createDirectory s 0o700
#endif