module System.Directory
(
- -- $intro
-
- -- * Permissions
-
- -- $permissions
-
- Permissions(
- Permissions,
- readable, -- :: Permissions -> Bool
- writable, -- :: Permissions -> Bool
- executable, -- :: Permissions -> Bool
- searchable -- :: Permissions -> Bool
- )
+ -- $intro
-- * Actions on directories
- , createDirectory -- :: FilePath -> IO ()
+ createDirectory -- :: FilePath -> IO ()
, removeDirectory -- :: FilePath -> IO ()
, renameDirectory -- :: FilePath -> FilePath -> IO ()
, doesFileExist -- :: FilePath -> IO Bool
, doesDirectoryExist -- :: FilePath -> IO Bool
- -- * Setting and retrieving permissions
+ -- * Permissions
+
+ -- $permissions
+
+ , Permissions(
+ Permissions,
+ readable, -- :: Permissions -> Bool
+ writable, -- :: Permissions -> Bool
+ executable, -- :: Permissions -> Bool
+ searchable -- :: Permissions -> Bool
+ )
, getPermissions -- :: FilePath -> IO Permissions
, setPermissions -- :: FilePath -> Permissions -> IO ()
executable, searchable :: Bool
} deriving (Eq, Ord, Read, Show)
+{- |The 'getPermissions' operation returns the
+permissions for the file or directory.
+
+The operation may fail with:
+
+* 'isPermissionError' if the user is not permitted to access
+ the permissions; or
+
+* 'isDoesNotExistError' if the file or directory does not exist.
+
+-}
+
getPermissions :: FilePath -> IO Permissions
getPermissions name = do
withCString name $ \s -> do
read <- c_access s r_OK
write <- c_access s w_OK
exec <- c_access s x_OK
- withFileStatus name $ \st -> do
+ withFileStatus "getPermissions" name $ \st -> do
is_dir <- isDirectory st
return (
Permissions {
}
)
+{- |The 'setPermissions' operation sets the
+permissions for the file or directory.
+
+The operation may fail with:
+
+* 'isPermissionError' if the user is not permitted to set
+ the permissions; or
+
+* 'isDoesNotExistError' if the file or directory does not exist.
+
+-}
+
setPermissions :: FilePath -> Permissions -> IO ()
setPermissions name (Permissions r w e s) = do
let
renameDirectory :: FilePath -> FilePath -> IO ()
renameDirectory opath npath =
- withFileStatus opath $ \st -> do
+ withFileStatus "renameDirectory" opath $ \st -> do
is_dir <- isDirectory st
if (not is_dir)
then ioException (IOError Nothing InappropriateType "renameDirectory"
renameFile :: FilePath -> FilePath -> IO ()
renameFile opath npath =
- withFileOrSymlinkStatus opath $ \st -> do
+ withFileOrSymlinkStatus "renameFile" opath $ \st -> do
is_dir <- isDirectory st
if is_dir
then ioException (IOError Nothing InappropriateType "renameFile"
throwErrnoIfMinus1Retry_ "setCurrentDirectory" (c_chdir s)
-- ToDo: add path to error
-{- |To clarify, 'doesDirectoryExist' returns 'True' if a file system object
-exist, and it's a directory. 'doesFileExist' returns 'True' if the file
-system object exist, but it's not a directory (i.e., for every other
-file system object that is not a directory.)
+{- |The operation 'doesDirectoryExist' returns 'True' if the argument file
+exists and is a directory, and 'False' otherwise.
-}
doesDirectoryExist :: FilePath -> IO Bool
doesDirectoryExist name =
catch
- (withFileStatus name $ \st -> isDirectory st)
+ (withFileStatus "doesDirectoryExist" name $ \st -> isDirectory st)
(\ _ -> return False)
+{- |The operation 'doesFileExist' returns 'True'
+if the argument file exists and is not a directory, and 'False' otherwise.
+-}
+
doesFileExist :: FilePath -> IO Bool
doesFileExist name = do
catch
- (withFileStatus name $ \st -> do b <- isDirectory st; return (not b))
+ (withFileStatus "doesFileExist" name $ \st -> do b <- isDirectory st; return (not b))
(\ _ -> return False)
+{- |The 'getModificationTime' operation returns the
+clock time at which the file or directory was last modified.
+
+The operation may fail with:
+
+* 'isPermissionError' if the user is not permitted to access
+ the modification time; or
+
+* 'isDoesNotExistError' if the file or directory does not exist.
+
+-}
+
getModificationTime :: FilePath -> IO ClockTime
getModificationTime name =
- withFileStatus name $ \ st ->
+ withFileStatus "getModificationTime" name $ \ st ->
modificationTime st
-withFileStatus :: FilePath -> (Ptr CStat -> IO a) -> IO a
-withFileStatus name f = do
+withFileStatus :: String -> FilePath -> (Ptr CStat -> IO a) -> IO a
+withFileStatus loc name f = do
modifyIOError (`ioeSetFileName` name) $
allocaBytes sizeof_stat $ \p ->
withCString (fileNameEndClean name) $ \s -> do
- throwErrnoIfMinus1Retry_ "withFileStatus" (c_stat s p)
+ throwErrnoIfMinus1Retry_ loc (c_stat s p)
f p
-withFileOrSymlinkStatus :: FilePath -> (Ptr CStat -> IO a) -> IO a
-withFileOrSymlinkStatus name f = do
+withFileOrSymlinkStatus :: String -> FilePath -> (Ptr CStat -> IO a) -> IO a
+withFileOrSymlinkStatus loc name f = do
modifyIOError (`ioeSetFileName` name) $
allocaBytes sizeof_stat $ \p ->
withCString name $ \s -> do
- throwErrnoIfMinus1Retry_ "withFileOrSymlinkStatus" (lstat s p)
+ throwErrnoIfMinus1Retry_ loc (lstat s p)
f p
modificationTime :: Ptr CStat -> IO ClockTime