| Haskell Hierarchical Libraries (base package) | Contents | Index

System.Directory

Portability | portable
Stability | stable
Maintainer | libraries@haskell.org

Contents

Actions on directories
Actions on files
Existence tests
Permissions
Timestamps

Description
System-independent interface to directory manipulation.
Synopsis

createDirectory :: FilePath -> IO ()
removeDirectory :: FilePath -> IO ()
renameDirectory :: FilePath -> FilePath -> IO ()
getDirectoryContents :: FilePath -> IO [FilePath]
getCurrentDirectory :: IO FilePath
setCurrentDirectory :: FilePath -> IO ()
removeFile :: FilePath -> IO ()
renameFile :: FilePath -> FilePath -> IO ()
doesFileExist :: FilePath -> IO Bool
doesDirectoryExist :: FilePath -> IO Bool

data Permissions = Permissions {

readable, writable, executable, searchable :: Bool

}

getPermissions :: FilePath -> IO Permissions
setPermissions :: FilePath -> Permissions -> IO ()
getModificationTime :: FilePath -> IO ClockTime

Documentation

A directory contains a series of entries, each of which is a named reference to a file system object (file, directory etc.). Some entries may be hidden, inaccessible, or have some administrative function (e.g. `.' or `..' under POSIX http://www.opengroup.org/onlinepubs/007904975/toc.htm), but in this standard all such entries are considered to form part of the directory contents. Entries in sub-directories are not, however, considered to form part of the directory contents.

Each file system object is referenced by a path. There is normally at least one absolute path to each file system object. In some operating systems, it may also be possible to have paths which are relative to the current directory.

Actions on directories
createDirectory :: FilePath -> IO ()

``createDirectory` dir` creates a new directory `dir` which is initially empty, or as near to empty as the operating system allows.

The operation may fail with:

- `isPermissionError` / `PermissionDenied` The process has insufficient privileges to perform the operation. `[EROFS, EACCES]`
- `isAlreadyExistsError` / `AlreadyExists` The operand refers to a directory that already exists. `[EEXIST]`
- `HardwareFault` A physical I/O error has occurred. `[EIO]`
- `InvalidArgument` The operand is not a valid directory name. `[ENAMETOOLONG, ELOOP]`
- `NoSuchThing` There is no path to the directory. `[ENOENT, ENOTDIR]`
- `ResourceExhausted` Insufficient resources (virtual memory, process file descriptors, physical disk space, etc.) are available to perform the operation. `[EDQUOT, ENOSPC, ENOMEM, EMLINK]`
- `InappropriateType` The path refers to an existing non-directory object. `[EEXIST]`

removeDirectory :: FilePath -> IO ()

``removeDirectory` dir` removes an existing directory dir. The implementation may specify additional constraints which must be satisfied before a directory can be removed (e.g. the directory has to be empty, or may not be in use by other processes). It is not legal for an implementation to partially remove a directory unless the entire directory is removed. A conformant implementation need not support directory removal in all situations (e.g. removal of the root directory).

The operation may fail with:

- `HardwareFault` A physical I/O error has occurred. EIO
- `InvalidArgument` The operand is not a valid directory name. [ENAMETOOLONG, ELOOP]
- `isDoesNotExistError` / `NoSuchThing` The directory does not exist. `[ENOENT, ENOTDIR]`
- `isPermissionError` / `PermissionDenied` The process has insufficient privileges to perform the operation. `[EROFS, EACCES, EPERM]`
- `UnsatisfiedConstraints` Implementation-dependent constraints are not satisfied. `[EBUSY, ENOTEMPTY, EEXIST]`
- `UnsupportedOperation` The implementation does not support removal in this situation. `[EINVAL]`
- `InappropriateType` The operand refers to an existing non-directory object. `[ENOTDIR]`

renameDirectory :: FilePath -> FilePath -> IO ()

``renameDirectory` old new` changes the name of an existing directory from old to new. If the new directory already exists, it is atomically replaced by the old directory. If the new directory is neither the old directory nor an alias of the old directory, it is removed as if by `removeDirectory`. A conformant implementation need not support renaming directories in all situations (e.g. renaming to an existing directory, or across different physical devices), but the constraints must be documented.

On Win32 platforms, `renameDirectory` fails if the new directory already exists.

The operation may fail with:

- `HardwareFault` A physical I/O error has occurred. `[EIO]`
- `InvalidArgument` Either operand is not a valid directory name. `[ENAMETOOLONG, ELOOP]`
- `isDoesNotExistError` / `NoSuchThing` The original directory does not exist, or there is no path to the target. `[ENOENT, ENOTDIR]`
- `isPermissionError` / `PermissionDenied` The process has insufficient privileges to perform the operation. `[EROFS, EACCES, EPERM]`
- `ResourceExhausted` Insufficient resources are available to perform the operation. `[EDQUOT, ENOSPC, ENOMEM, EMLINK]`
- `UnsatisfiedConstraints` Implementation-dependent constraints are not satisfied. `[EBUSY, ENOTEMPTY, EEXIST]`
- `UnsupportedOperation` The implementation does not support renaming in this situation. `[EINVAL, EXDEV]`
- `InappropriateType` Either path refers to an existing non-directory object. `[ENOTDIR, EISDIR]`

getDirectoryContents :: FilePath -> IO [FilePath]

``getDirectoryContents` dir` returns a list of all entries in dir.

The operation may fail with:

- `HardwareFault` A physical I/O error has occurred. `[EIO]`
- `InvalidArgument` The operand is not a valid directory name. `[ENAMETOOLONG, ELOOP]`
- `isDoesNotExistError` / `NoSuchThing` The directory does not exist. `[ENOENT, ENOTDIR]`
- `isPermissionError` / `PermissionDenied` The process has insufficient privileges to perform the operation. `[EACCES]`
- `ResourceExhausted` Insufficient resources are available to perform the operation. `[EMFILE, ENFILE]`
- `InappropriateType` The path refers to an existing non-directory object. `[ENOTDIR]`

getCurrentDirectory :: IO FilePath

If the operating system has a notion of current directories, `getCurrentDirectory` returns an absolute path to the current directory of the calling process.

The operation may fail with:

- `HardwareFault` A physical I/O error has occurred. `[EIO]`
- `isDoesNotExistError` / `NoSuchThing` There is no path referring to the current directory. `[EPERM, ENOENT, ESTALE...]`
- `isPermissionError` / `PermissionDenied` The process has insufficient privileges to perform the operation. `[EACCES]`
- `ResourceExhausted` Insufficient resources are available to perform the operation.
- `UnsupportedOperation` The operating system has no notion of current directory.

setCurrentDirectory :: FilePath -> IO ()

If the operating system has a notion of current directories, ``setCurrentDirectory` dir` changes the current directory of the calling process to dir.

The operation may fail with:

- `HardwareFault` A physical I/O error has occurred. `[EIO]`
- `InvalidArgument` The operand is not a valid directory name. `[ENAMETOOLONG, ELOOP]`
- `isDoesNotExistError` / `NoSuchThing` The directory does not exist. `[ENOENT, ENOTDIR]`
- `isPermissionError` / `PermissionDenied` The process has insufficient privileges to perform the operation. `[EACCES]`
- `UnsupportedOperation` The operating system has no notion of current directory, or the current directory cannot be dynamically changed.
- `InappropriateType` The path refers to an existing non-directory object. `[ENOTDIR]`

Actions on files
removeFile :: FilePath -> IO ()

`removeFile` file removes the directory entry for an existing file file, where file is not itself a directory. The implementation may specify additional constraints which must be satisfied before a file can be removed (e.g. the file may not be in use by other processes).

The operation may fail with:

- `HardwareFault` A physical I/O error has occurred. `[EIO]`
- `InvalidArgument` The operand is not a valid file name. `[ENAMETOOLONG, ELOOP]`
- `isDoesNotExistError` / `NoSuchThing` The file does not exist. `[ENOENT, ENOTDIR]`
- `isPermissionError` / `PermissionDenied` The process has insufficient privileges to perform the operation. `[EROFS, EACCES, EPERM]`
- `UnsatisfiedConstraints` Implementation-dependent constraints are not satisfied. `[EBUSY]`
- `InappropriateType` The operand refers to an existing directory. `[EPERM, EINVAL]`

renameFile :: FilePath -> FilePath -> IO ()

``renameFile` old new` changes the name of an existing file system object from old to new. If the new object already exists, it is atomically replaced by the old object. Neither path may refer to an existing directory. A conformant implementation need not support renaming files in all situations (e.g. renaming across different physical devices), but the constraints must be documented.

The operation may fail with:

- `HardwareFault` A physical I/O error has occurred. `[EIO]`
- `InvalidArgument` Either operand is not a valid file name. `[ENAMETOOLONG, ELOOP]`
- `isDoesNotExistError` / `NoSuchThing` The original file does not exist, or there is no path to the target. `[ENOENT, ENOTDIR]`
- `isPermissionError` / `PermissionDenied` The process has insufficient privileges to perform the operation. `[EROFS, EACCES, EPERM]`
- `ResourceExhausted` Insufficient resources are available to perform the operation. `[EDQUOT, ENOSPC, ENOMEM, EMLINK]`
- `UnsatisfiedConstraints` Implementation-dependent constraints are not satisfied. `[EBUSY]`
- `UnsupportedOperation` The implementation does not support renaming in this situation. `[EXDEV]`
- `InappropriateType` Either path refers to an existing directory. `[ENOTDIR, EISDIR, EINVAL, EEXIST, ENOTEMPTY]`

Existence tests
doesFileExist :: FilePath -> IO Bool
The operation `doesFileExist` returns `True` if the argument file exists and is not a directory, and `False` otherwise.
doesDirectoryExist :: FilePath -> IO Bool
The operation `doesDirectoryExist` returns `True` if the argument file exists and is a directory, and `False` otherwise.
Permissions

The `Permissions` type is used to record whether certain operations are permissible on a file/directory. `getPermissions` and `setPermissions` get and set these permissions, respectively. Permissions apply both to files and directories. For directories, the executable field will be `False`, and for files the searchable field will be `False`. Note that directories may be searchable without being readable, if permission has been given to use them as part of a path, but not to examine the directory contents.

Note that to change some, but not all permissions, a construct on the following lines must be used.

      makeReadable f = do
         p <- getPermissions f
         setPermissions f (p {readable = True})

data Permissions

Constructors

Permissions |

readable, writable, executable, searchable :: Bool |

Instances

Eq Permissions
Ord Permissions
Read Permissions
Show Permissions

getPermissions :: FilePath -> IO Permissions

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.

setPermissions :: FilePath -> Permissions -> IO ()

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.

Timestamps
getModificationTime :: FilePath -> IO ClockTime

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.

Produced by Haddock version 0.6