Platform-agnostic library for filesystem operations

Version on this page:
LTS Haskell 22.30:
Stackage Nightly 2024-07-23:
Latest on Hackage:

See all snapshots directory appears in

BSD-3-Clause licensed
Maintained by [email protected]
This version can be pinned in stack with:directory-,2942

Module documentation for


Hackage Build status Dependencies status

Documentation can be found on Hackage. Changes between versions are recorded in the change log.

Building from Git repository

When building this package directly from the Git repository, one must run autoreconf -fi to generate the configure script needed by cabal configure. This requires Autoconf to be installed.

autoreconf -fi
cabal install

There is no need to run the configure script manually however, as cabal configure does that automatically.


Changelog for the directory package (Feb 2023)

  • Use CApiFFI for utimensat. (#145)
  • Relax base version bounds to support 4.18. (#151) (Sep 2022)

  • Drop support for base older than 4.11.0.
  • Drop support for filepath older than 1.4.100.
  • Drop support for time older than 1.8.0.
  • Drop support for unix older than 2.8.0.
  • Drop support for Win32 older than 2.13.3.
  • Modules in directory are no longer considered Safe because the System.OsPath dependency is no longer Safe.
  • A new module, System.Directory.OsPath, has been introduced to support AFPP (OsPath and OsString) with an analogous API. The old module, System.Directory, shall be in maintenance mode as new features will no longer be accepted there. (#136)
  • removePathForcibly no longer changes permissions of files on non-Windows systems. (#135) (Jul 2022)

  • Relax time version bounds to support 1.12.
  • Relax Win32 version bounds to support 2.13.
  • Relax base version bounds to support 4.17. (Sep 2021)

  • getXdgDirectory now supports XdgState (XDG_STATE_HOME). (#121) (May 2021)

  • Relax Win32 version bounds to support 2.11.
  • Relax time version bounds to support 1.11.
  • Relax base version bounds to support 4.16. (March 2020)

  • Relax time version bounds to support 1.10. (January 2020)

  • On non-Windows platforms, getHomeDirectory will fall back to getpwuid_r if HOME is not set. (#102) (December 2019) (July 2019)

  • getXdgDirectory and getXdgDirectoryList on Windows will now respect the XDG environment variables if present. (#95) (January 2019)

  • getXdgDirectory will no longer reject environment variables containing relative paths. (#87) (August 2018)

  • doesDirectoryExist and doesPathExist reject empty paths once again, reversing an undocumented change introduced in (#84) (June 2018)

  • Relax unix version bounds to support 2.8.

  • Relax Win32 version bounds to support 2.8.

  • Use SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE when creating symbolic links on Windows, if possible. (#83) (April 2018)

  • Relax base version bounds to support 4.12. (March 2018)

  • Relax Win32 version bounds to support 2.7. (January 2018)

  • Relax time version bounds to support 1.9.

  • Implement getXdgDirectoryList and XdgDirectoryList. (#78) (October 2017)

  • Rename the internal header windows.h to avoid GHC#14312. (#77) (September 2017)

  • Fix Win32 version 2.6 compatibility. (#75) (September 2017)

  • Relax Win32 version bounds to support 2.6. (September 2017)

  • Relax base version bounds to support 4.11. (#74) (March 2017)

  • Fix a bug where createFileLink and createDirectoryLink failed to handle .. in absolute paths.

  • Improve support (partially) for paths longer than 260 characters on Windows. To achieve this, many functions will now automatically prepend \\?\ before calling the Windows API. As a side effect, the \\?\ prefix may show up in the error messages of the affected functions.

  • makeAbsolute can now handle drive-relative paths on Windows such as C:foobar (March 2017)

  • findFile (and similar functions): when an absolute path is given, the list of search directories is now completely ignored. Previously, if the list was empty, findFile would always fail. (#72)

  • For symbolic links on Windows, the following functions had previously interpreted paths as referring to the links themselves rather than their targets. This was inconsistent with other platforms and has been fixed.

    • getFileSize
    • doesPathExist
    • doesDirectoryExist
    • doesFileExist
  • Fix incorrect location info in errors from pathIsSymbolicLink.

  • Add functions for symbolic link manipulation:

    • createFileLink
    • createDirectoryLink
    • removeDirectoryLink
    • getSymbolicLinkTarget
  • canonicalizePath can now resolve broken symbolic links too. (#64) (February 2017)

  • [optimization] Increase internal buffer size of copyFile (#69)

  • Relax time version bounds to support 1.8. (January 2017)

  • Relax Win32 version bounds to support 2.5. (#67) (December 2016)

  • [breaking] Drop trailing slashes in canonicalizePath (#63)

  • [deprecation] Rename isSymbolicLink to pathIsSymbolicLink. The old name will remain available but may be removed in the next major release. (#52)

  • Changed canonicalizePath to dereference symbolic links even if it points to a file and is not the last path segment

  • On Windows, canonicalizePath now canonicalizes the letter case too

  • On Windows, canonicalizePath now also dereferences symbolic links

  • When exceptions are thrown, the error location will now contain additional information about the internal function(s) used. (November 2016)

  • Don’t abort removePathForcibly if files or directories go missing. In addition, keep going even if an exception occurs. (#60) (August 2016)

  • Remove deprecated C bits. This means HsDirectory.h and its functions are no longer available. (#50)

  • Add doesPathExist and getFileSize (#57)

  • Add renamePath (#58)

  • Add removePathForcibly (#59) (May 2016)

  • Add missing import of (<*>) on Windows for base earlier than (#53) (April 2016)

  • Bundled with GHC 8.0.1

  • Fix typo in file time functions when utimensat is not available and version of unix package is lower than (April 2016)

  • Fix mistake in file time functions when utimensat is not available (#47) (April 2016)

  • Make findExecutable, findExecutables, findExecutablesInDirectories, findFile, and findFilesWith lazier (#43)

  • Add findFileWith

  • Add copyFileWithMetadata, which copies additional metadata (#40)

  • Improve error message of removeDirectoryRecursive when used on a directory symbolic link on Windows.

  • Add isSymbolicLink

  • Drop support for Hugs. (February 2016)

  • Improve error message of getCurrentDirectory when the current working directory no longer exists (#39)

  • Fix the behavior of trailing path separators in canonicalizePath as well as makeAbsolute when applied to the current directory; they should now match the behavior of canonicalizePath prior to (when the bug was introduced) (#42)

  • Set the location in IO errors from makeAbsolute. (December 2015)

  • Add listDirectory, which is similar to getDirectoryContents but omits . and .. (#36)

  • Remove support for --with-cc= in configure; use the CC= flag instead (ghc:D1608) (September 2015)

  • Work around lack of #const_str when cross-compiling (haskell-cafe)

  • Add findExecutablesInDirectories (#33)

  • Add exeExtension (August 2015)

  • Restore support for Safe Haskell with base < 4.8 (#30) (July 2015)

  • Add support for XDG Base Directory Specification (#6)

  • Implement setModificationTime counterpart to getModificationTime (#13)

  • Implement getAccessTime and setAccessTime

  • Set the filename in IO errors from the file time functions

  • Fix canonicalizePath so that it always returns a reasonable result even if the path is inaccessible and will not throw exceptions unless the current directory cannot be obtained (#23)

  • Corrected the trailing slash behavior of makeAbsolute so that makeAbsolute "" == makeAbsolute "."

  • Deprecate use of HsDirectory.h and HsDirectoryConfig.h

  • Implement withCurrentDirectory (Apr 2015)

  • Fix dependency problem on NixOS when building with tests (#24) (Mar 2015)

  • Bundled with GHC 7.10.1

  • Make getModificationTime support sub-second resolution on Windows

  • Fix silent failure in createDirectoryIfMissing

  • Replace throw by better defined throwIOs

  • Avoid stack overflow in getDirectoryContents (#17)

  • Expose findExecutables (#14)

  • removeDirectoryRecursive no longer follows symlinks under any circumstances (#15)

  • Allow trailing path separators in getPermissions on Windows (#9)

  • renameFile now always throws the correct error type (InappropriateType) when the destination is a directory, as long as the filesystem is not being modified concurrently (#8)

  • Add makeAbsolute, which should be preferred over canonicalizePath unless one requires symbolic links to be resolved (Mar 2014)

  • Bundled with GHC 7.8.1

  • Add support for sub-second precision in getModificationTime when linked against unix>=

  • Fix createDirectoryIfMissing _ "." in C:\ on Windows

  • Remove support for NHC98 compiler

  • Update package to cabal-version >= 1.10 format

  • Enhance Haddock documentation for doesDirectoryExist and canonicalizePath

  • Fix findExecutable to check that file permissions indicate executable

  • New convenience functions findFiles and findFilesWith