<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"/><title>HPath.IO</title><linkhref="ocean.css"rel="stylesheet"type="text/css"title="Ocean"/><scriptsrc="haddock-util.js"type="text/javascript"></script><scripttype="text/javascript">//<![CDATA[
copy, delete, move and so on. It only operates on <em>Path Abs</em> which
guarantees us well-typed paths which are absolute.</p><p>Some functions are just path-safe wrappers around
unix functions, others have stricter exception handling
and some implement functionality that doesn't have a unix
counterpart (like <code><ahref="HPath-IO.html#v:copyDirRecursive">copyDirRecursive</a></code>).</p><p>Some of these operations are due to their nature <strong>not atomic</strong>, which
means they may do multiple syscalls which form one context. Some
of them also have to examine the filetypes explicitly before the
syscalls, so a reasonable decision can be made. That means
the result is undefined if another process changes that context
while the non-atomic operation is still happening. However, where
possible, as few syscalls as possible are used and the underlying
exception handling is kept.</p><p>Note: <code><ahref="HPath-IO.html#v:BlockDevice">BlockDevice</a></code>, <code><ahref="HPath-IO.html#v:CharacterDevice">CharacterDevice</a></code>, <code><ahref="HPath-IO.html#v:NamedPipe">NamedPipe</a></code> and <code><ahref="HPath-IO.html#v:Socket">Socket</a></code>
are ignored by some of the more high-level functions (like <code><ahref="HPath-IO.html#v:easyCopy">easyCopy</a></code>).
For other functions (like <code><ahref="HPath-IO.html#v:copyFile">copyFile</a></code>), the behavior on these file types is
for IO operations.</p><p>On <code><ahref="HPath-IO.html#v:CollectFailures">CollectFailures</a></code> skips errors in the recursion and keeps on recursing.
However all errors are collected in the <code><ahref="HPath-IO-Errors.html#v:RecursiveFailure">RecursiveFailure</a></code> error type,
which is raised finally if there was any error.</p></div><divclass="subs constructors"><pclass="caption">Constructors</p><table><tr><tdclass="src"><aname="v:FailEarly"class="def">FailEarly</a></td><tdclass="doc empty"> </td></tr><tr><tdclass="src"><aname="v:CollectFailures"class="def">CollectFailures</a></td><tdclass="doc empty"> </td></tr></table></div></div><divclass="top"><pclass="src"><spanclass="keyword">data</span><aname="t:CopyMode"class="def">CopyMode</a><ahref="src/HPath-IO.html#CopyMode"class="link">Source</a></p><divclass="doc"><p>The mode for copy and file moves.
shortcut.</p></div><divclass="subs constructors"><pclass="caption">Constructors</p><table><tr><tdclass="src"><aname="v:Strict"class="def">Strict</a></td><tdclass="doc"><p>fail if any target exists</p></td></tr><tr><tdclass="src"><aname="v:Overwrite"class="def">Overwrite</a></td><tdclass="doc"><p>overwrite targets</p></td></tr></table></div></div><h1id="g:2">File copying</h1><divclass="top"><pclass="src"><aname="v:copyDirRecursive"class="def">copyDirRecursive</a><ahref="src/HPath-IO.html#copyDirRecursive"class="link">Source</a></p><divclass="subs arguments"><pclass="caption">Arguments</p><table><tr><tdclass="src">:: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>copy contents of this source dir</p></td></tr><tr><tdclass="src">-><ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>to this full destination (parent dirs
are not automatically created)</p></td></tr><tr><tdclass="src">-><ahref="HPath-IO.html#t:CopyMode">CopyMode</a></td><tdclass="doc empty"> </td></tr><tr><tdclass="src">-><ahref="HPath-IO.html#t:RecursiveErrorMode">RecursiveErrorMode</a></td><tdclass="doc empty"> </td></tr><tr><tdclass="src">-><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> ()</td><tdclass="doc empty"> </td></tr></table></div><divclass="doc"><p>Copies the contents of a directory recursively to the given destination.
<code><ahref="HPath-IO.html#v:RegularFile">RegularFile</a></code>, <code><ahref="HPath-IO.html#v:SymbolicLink">SymbolicLink</a></code> or <code><ahref="HPath-IO.html#v:Directory">Directory</a></code>.</p><p>For <code><ahref="HPath-IO.html#v:Overwrite">Overwrite</a></code> copy mode this does not prune destination directory
contents, so the destination might contain more files than the source after
the operation has completed. Permissions of existing directories are
fixed.</p><p>Note that there is no guaranteed ordering of the exceptions
contained within <code><ahref="HPath-IO-Errors.html#v:RecursiveFailure">RecursiveFailure</a></code> in <code><ahref="HPath-IO.html#v:CollectFailures">CollectFailures</a></code> RecursiveErrorMode.</p><p>Safety/reliability concerns:</p><ul><li>not atomic</li><li>examines filetypes explicitly</li><li>an explicit check <code><ahref="HPath-IO-Errors.html#v:throwDestinationInSource">throwDestinationInSource</a></code> is carried out for the
carried out recursively (because it's slow)</li></ul><p>Throws:</p><ul><li><code>NoSuchThing</code> if source directory does not exist</li><li><code>PermissionDenied</code> if source directory can't be opened</li><li><code><ahref="HPath-IO-Errors.html#v:SameFile">SameFile</a></code> if source and destination are the same file
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li><li><code><ahref="HPath-IO-Errors.html#v:DestinationInSource">DestinationInSource</a></code> if destination is contained in source
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li></ul><p>Throws in <code><ahref="HPath-IO.html#v:FailEarly">FailEarly</a></code> RecursiveErrorMode only:</p><ul><li><code>PermissionDenied</code> if output directory is not writable</li><li><code>InvalidArgument</code> if source directory is wrong type (symlink)</li><li><code>InappropriateType</code> if source directory is wrong type (regular file)</li></ul><p>Throws in <code><ahref="HPath-IO.html#v:CollectFailures">CollectFailures</a></code> RecursiveErrorMode only:</p><ul><li><code><ahref="HPath-IO-Errors.html#v:RecursiveFailure">RecursiveFailure</a></code> if any of the recursive operations that are not
part of the top-directory sanity-checks fail (<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li></ul><p>Throws in <code><ahref="HPath-IO.html#v:Strict">Strict</a></code> CopyMode only:</p><ul><li><code>AlreadyExists</code> if destination already exists</li></ul></div></div><divclass="top"><pclass="src"><aname="v:recreateSymlink"class="def">recreateSymlink</a><ahref="src/HPath-IO.html#recreateSymlink"class="link">Source</a></p><divclass="subs arguments"><pclass="caption">Arguments</p><table><tr><tdclass="src">:: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>the old symlink file</p></td></tr><tr><tdclass="src">-><ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>destination file</p></td></tr><tr><tdclass="src">-><ahref="HPath-IO.html#t:CopyMode">CopyMode</a></td><tdclass="doc empty"> </td></tr><tr><tdclass="src">-><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> ()</td><tdclass="doc empty"> </td></tr></table></div><divclass="doc"><p>Recreate a symlink.</p><p>In <code><ahref="HPath-IO.html#v:Overwrite">Overwrite</a></code> copy mode only files and empty directories are deleted.</p><p>Safety/reliability concerns:</p><ul><li><code><ahref="HPath-IO.html#v:Overwrite">Overwrite</a></code> mode is inherently non-atomic</li></ul><p>Throws:</p><ul><li><code>InvalidArgument</code> if source file is wrong type (not a symlink)</li><li><code>PermissionDenied</code> if output directory cannot be written to</li><li><code>PermissionDenied</code> if source directory cannot be opened</li><li><code><ahref="HPath-IO-Errors.html#v:SameFile">SameFile</a></code> if source and destination are the same file
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li></ul><p>Throws in <code><ahref="HPath-IO.html#v:Strict">Strict</a></code> mode only:</p><ul><li><code>AlreadyExists</code> if destination file already exists</li></ul><p>Throws in <code><ahref="HPath-IO.html#v:Overwrite">Overwrite</a></code> mode only:</p><ul><li><code>UnsatisfiedConstraints</code> if destination file is non-empty directory</li></ul><p>Note: calls <code>symlink</code></p></div></div><divclass="top"><pclass="src"><aname="v:copyFile"class="def">copyFile</a><ahref="src/HPath-IO.html#copyFile"class="link">Source</a></p><divclass="subs arguments"><pclass="caption">Arguments</p><table><tr><tdclass="src">:: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>source file</p></td></tr><tr><tdclass="src">-><ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>destination file</p></td></tr><tr><tdclass="src">-><ahref="HPath-IO.html#t:CopyMode">CopyMode</a></td><tdclass="doc empty"> </td></tr><tr><tdclass="src">-><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> ()</td><tdclass="doc empty"> </td></tr></table></div><divclass="doc"><p>Copies the given regular file to the given destination.
For "copying" symbolic links, use <code><ahref="HPath-IO.html#v:recreateSymlink">recreateSymlink</a></code> instead.</p><p>Note that this is still sort of a low-level function and doesn't
examine file types. For a more high-level version, use <code><ahref="HPath-IO.html#v:easyCopy">easyCopy</a></code>
instead.</p><p>In <code><ahref="HPath-IO.html#v:Overwrite">Overwrite</a></code> copy mode only overwrites actual files, not directories.</p><p>Safety/reliability concerns:</p><ul><li><code><ahref="HPath-IO.html#v:Overwrite">Overwrite</a></code> mode is not atomic</li><li>when used on <code><ahref="HPath-IO.html#v:CharacterDevice">CharacterDevice</a></code>, reads the "contents" and copies
them to a regular file, which might take indefinitely</li><li>when used on <code><ahref="HPath-IO.html#v:BlockDevice">BlockDevice</a></code>, may either read the "contents"
and copy them to a regular file (potentially hanging indefinitely)
or may create a regular empty destination file</li><li>when used on <code><ahref="HPath-IO.html#v:NamedPipe">NamedPipe</a></code>, will hang indefinitely</li></ul><p>Throws:</p><ul><li><code>NoSuchThing</code> if source file does not exist</li><li><code>NoSuchThing</code> if source file is a a <code><ahref="HPath-IO.html#v:Socket">Socket</a></code></li><li><code>PermissionDenied</code> if output directory is not writable</li><li><code>PermissionDenied</code> if source directory can't be opened</li><li><code>InvalidArgument</code> if source file is wrong type (symlink or directory)</li><li><code><ahref="HPath-IO-Errors.html#v:SameFile">SameFile</a></code> if source and destination are the same file
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li></ul><p>Throws in <code><ahref="HPath-IO.html#v:Strict">Strict</a></code> mode only:</p><ul><li><code>AlreadyExists</code> if destination already exists</li></ul><p>Note: calls <code>sendfile</code> and possibly <code><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/Text-Read.html#v:read">read</a></code>/<code>write</code> as fallback</p></div></div><divclass="top"><pclass="src"><aname="v:easyCopy"class="def">easyCopy</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="HPath-IO.html#t:CopyMode">CopyMode</a> -><ahref="HPath-IO.html#t:RecursiveErrorMode">RecursiveErrorMode</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> () <ahref="src/HPath-IO.html#easyCopy"class="link">Source</a></p><divclass="doc"><p>Copies a regular file, directory or symbolic link. In case of a
Any other file type is ignored.</p><p>Safety/reliability concerns:</p><ul><li>examines filetypes explicitly</li><li>calls <code><ahref="HPath-IO.html#v:copyDirRecursive">copyDirRecursive</a></code> for directories</li></ul></div></div><h1id="g:3">File deletion</h1><divclass="top"><pclass="src"><aname="v:deleteFile"class="def">deleteFile</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> () <ahref="src/HPath-IO.html#deleteFile"class="link">Source</a></p><divclass="doc"><p>Deletes the given file. Raises <code>eISDIR</code>
if run on a directory. Does not follow symbolic links.</p><p>Throws:</p><ul><li><code>InappropriateType</code> for wrong file type (directory)</li><li><code>NoSuchThing</code> if the file does not exist</li><li><code>PermissionDenied</code> if the directory cannot be read</li></ul></div></div><divclass="top"><pclass="src"><aname="v:deleteDir"class="def">deleteDir</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> () <ahref="src/HPath-IO.html#deleteDir"class="link">Source</a></p><divclass="doc"><p>Deletes the given directory, which must be empty, never symlinks.</p><p>Throws:</p><ul><li><code>InappropriateType</code> for wrong file type (symlink to directory)</li><li><code>InappropriateType</code> for wrong file type (regular file)</li><li><code>NoSuchThing</code> if directory does not exist</li><li><code>UnsatisfiedConstraints</code> if directory is not empty</li><li><code>PermissionDenied</code> if we can't open or write to parent directory</li></ul><p>Notes: calls <code>rmdir</code></p></div></div><divclass="top"><pclass="src"><aname="v:deleteDirRecursive"class="def">deleteDirRecursive</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> () <ahref="src/HPath-IO.html#deleteDirRecursive"class="link">Source</a></p><divclass="doc"><p>Deletes the given directory recursively. Does not follow symbolic
<code><ahref="HPath-IO.html#v:SymbolicLink">SymbolicLink</a></code> or <code><ahref="HPath-IO.html#v:Directory">Directory</a></code>.</p><p>Safety/reliability concerns:</p><ul><li>not atomic</li><li>examines filetypes explicitly</li></ul><p>Throws:</p><ul><li><code>InappropriateType</code> for wrong file type (symlink to directory)</li><li><code>InappropriateType</code> for wrong file type (regular file)</li><li><code>NoSuchThing</code> if directory does not exist</li><li><code>PermissionDenied</code> if we can't open or write to parent directory</li></ul></div></div><divclass="top"><pclass="src"><aname="v:easyDelete"class="def">easyDelete</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> () <ahref="src/HPath-IO.html#easyDelete"class="link">Source</a></p><divclass="doc"><p>Deletes a file, directory or symlink.
Any other file type is ignored.</p><p>Safety/reliability concerns:</p><ul><li>examines filetypes explicitly</li><li>calls <code><ahref="HPath-IO.html#v:deleteDirRecursive">deleteDirRecursive</a></code> for directories</li></ul></div></div><h1id="g:4">File opening</h1><divclass="top"><pclass="src"><aname="v:openFile"class="def">openFile</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-Posix-Types.html#t:ProcessID">ProcessID</a><ahref="src/HPath-IO.html#openFile"class="link">Source</a></p><divclass="doc"><p>Opens a file appropriately by invoking xdg-open. The file type
is not checked. This forks a process.</p></div></div><divclass="top"><pclass="src"><aname="v:executeFile"class="def">executeFile</a><ahref="src/HPath-IO.html#executeFile"class="link">Source</a></p><divclass="subs arguments"><pclass="caption">Arguments</p><table><tr><tdclass="src">:: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>program</p></td></tr><tr><tdclass="src">-> [<ahref="https://hackage.haskell.org/package/bytestring-0.10.6.0/docs/Data-ByteString.html#t:ByteString">ByteString</a>]</td><tdclass="doc"><p>arguments</p></td></tr><tr><tdclass="src">-><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-Posix-Types.html#t:ProcessID">ProcessID</a></td><tdclass="doc empty"> </td></tr></table></div><divclass="doc"><p>Executes a program with the given arguments. This forks a process.</p></div></div><h1id="g:5">File creation</h1><divclass="top"><pclass="src"><aname="v:createRegularFile"class="def">createRegularFile</a> :: <ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-Posix-Types.html#t:FileMode">FileMode</a> -><ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> () <ahref="src/HPath-IO.html#createRegularFile"class="link">Source</a></p><divclass="doc"><p>Create an empty regular file at the given directory with the given
filename.</p><p>Throws:</p><ul><li><code>PermissionDenied</code> if output directory cannot be written to</li><li><code>AlreadyExists</code> if destination file already exists</li><li><code>NoSuchThing</code> if any of the parent components of the path
do not exist</li></ul></div></div><divclass="top"><pclass="src"><aname="v:createDir"class="def">createDir</a> :: <ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-Posix-Types.html#t:FileMode">FileMode</a> -><ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> () <ahref="src/HPath-IO.html#createDir"class="link">Source</a></p><divclass="doc"><p>Create an empty directory at the given directory with the given filename.</p><p>Throws:</p><ul><li><code>PermissionDenied</code> if output directory cannot be written to</li><li><code>AlreadyExists</code> if destination directory already exists</li><li><code>NoSuchThing</code> if any of the parent components of the path
do not exist</li></ul></div></div><divclass="top"><pclass="src"><aname="v:createSymlink"class="def">createSymlink</a><ahref="src/HPath-IO.html#createSymlink"class="link">Source</a></p><divclass="subs arguments"><pclass="caption">Arguments</p><table><tr><tdclass="src">:: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>destination file</p></td></tr><tr><tdclass="src">-><ahref="https://hackage.haskell.org/package/bytestring-0.10.6.0/docs/Data-ByteString.html#t:ByteString">ByteString</a></td><tdclass="doc"><p>path the symlink points to</p></td></tr><tr><tdclass="src">-><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> ()</td><tdclass="doc empty"> </td></tr></table></div><divclass="doc"><p>Create a symlink.</p><p>Throws:</p><ul><li><code>PermissionDenied</code> if output directory cannot be written to</li><li><code>AlreadyExists</code> if destination file already exists</li><li><code>NoSuchThing</code> if any of the parent components of the path
do not exist</li></ul><p>Note: calls <code>symlink</code></p></div></div><h1id="g:6">File renaming/moving</h1><divclass="top"><pclass="src"><aname="v:renameFile"class="def">renameFile</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> () <ahref="src/HPath-IO.html#renameFile"class="link">Source</a></p><divclass="doc"><p>Rename a given file with the provided filename. Destination and source
must be on the same device, otherwise <code><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/Foreign-C-Error.html#v:eXDEV">eXDEV</a></code> will be raised.</p><p>Does not follow symbolic links, but renames the symbolic link file.</p><p>Safety/reliability concerns:</p><ul><li>has a separate set of exception handling, apart from the syscall</li></ul><p>Throws:</p><ul><li><code>NoSuchThing</code> if source file does not exist</li><li><code>PermissionDenied</code> if output directory cannot be written to</li><li><code>PermissionDenied</code> if source directory cannot be opened</li><li><code>UnsupportedOperation</code> if source and destination are on different
devices</li><li><code><ahref="HPath-IO-Errors.html#v:FileDoesExist">FileDoesExist</a></code> if destination file already exists
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li><li><code><ahref="HPath-IO-Errors.html#v:DirDoesExist">DirDoesExist</a></code> if destination directory already exists
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li><li><code><ahref="HPath-IO-Errors.html#v:SameFile">SameFile</a></code> if destination and source are the same file
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li></ul><p>Note: calls <code><ahref="https://hackage.haskell.org/package/unix-2.7.1.0/docs/System-Posix-Files-ByteString.html#v:rename">rename</a></code> (but does not allow to rename over existing files)</p></div></div><divclass="top"><pclass="src"><aname="v:moveFile"class="def">moveFile</a><ahref="src/HPath-IO.html#moveFile"class="link">Source</a></p><divclass="subs arguments"><pclass="caption">Arguments</p><table><tr><tdclass="src">:: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>file to move</p></td></tr><tr><tdclass="src">-><ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>destination</p></td></tr><tr><tdclass="src">-><ahref="HPath-IO.html#t:CopyMode">CopyMode</a></td><tdclass="doc empty"> </td></tr><tr><tdclass="src">-><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> ()</td><tdclass="doc empty"> </td></tr></table></div><divclass="doc"><p>Move a file. This also works across devices by copy-delete fallback.
And also works on directories.</p><p>Does not follow symbolic links, but renames the symbolic link file.</p><p>Safety/reliability concerns:</p><ul><li><code><ahref="HPath-IO.html#v:Overwrite">Overwrite</a></code> mode is not atomic</li><li>copy-delete fallback is inherently non-atomic</li><li>since this function calls <code><ahref="HPath-IO.html#v:easyCopy">easyCopy</a></code> and <code><ahref="HPath-IO.html#v:easyDelete">easyDelete</a></code> as a fallback
to <code><ahref="HPath-IO.html#v:renameFile">renameFile</a></code>, file types that are not <code><ahref="HPath-IO.html#v:RegularFile">RegularFile</a></code>, <code><ahref="HPath-IO.html#v:SymbolicLink">SymbolicLink</a></code>
or <code><ahref="HPath-IO.html#v:Directory">Directory</a></code> may be ignored</li><li>for <code><ahref="HPath-IO.html#v:Overwrite">Overwrite</a></code> mode, the destination will be deleted (not recursively)
before moving</li></ul><p>Throws:</p><ul><li><code>NoSuchThing</code> if source file does not exist</li><li><code>PermissionDenied</code> if output directory cannot be written to</li><li><code>PermissionDenied</code> if source directory cannot be opened</li><li><code><ahref="HPath-IO-Errors.html#v:SameFile">SameFile</a></code> if destination and source are the same file
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li></ul><p>Throws in <code><ahref="HPath-IO.html#v:Strict">Strict</a></code> mode only:</p><ul><li><code><ahref="HPath-IO-Errors.html#v:FileDoesExist">FileDoesExist</a></code> if destination file already exists (<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li><li><code><ahref="HPath-IO-Errors.html#v:DirDoesExist">DirDoesExist</a></code> if destination directory already exists
(<code><ahref="HPath-IO-Errors.html#t:HPathIOException">HPathIOException</a></code>)</li></ul><p>Note: calls <code><ahref="https://hackage.haskell.org/package/unix-2.7.1.0/docs/System-Posix-Files-ByteString.html#v:rename">rename</a></code> (but does not allow to rename over existing files)</p></div></div><h1id="g:7">File permissions</h1><divclass="top"><pclass="src"><aname="v:newFilePerms"class="def">newFilePerms</a> :: <ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-Posix-Types.html#t:FileMode">FileMode</a><ahref="src/HPath-IO.html#newFilePerms"class="link">Source</a></p><divclass="doc"><p>Default permissions for a new file.</p></div></div><divclass="top"><pclass="src"><aname="v:newDirPerms"class="def">newDirPerms</a> :: <ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-Posix-Types.html#t:FileMode">FileMode</a><ahref="src/HPath-IO.html#newDirPerms"class="link">Source</a></p><divclass="doc"><p>Default permissions for a new directory.</p></div></div><h1id="g:8">Directory reading</h1><divclass="top"><pclass="src"><aname="v:getDirsFiles"class="def">getDirsFiles</a><ahref="src/HPath-IO.html#getDirsFiles"class="link">Source</a></p><divclass="subs arguments"><pclass="caption">Arguments</p><table><tr><tdclass="src">:: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a></td><tdclass="doc"><p>dir to read</p></td></tr><tr><tdclass="src">-><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> [<ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a>]</td><tdclass="doc empty"> </td></tr></table></div><divclass="doc"><p>Gets all filenames of the given directory. This excludes "." and "..".
This version does not follow symbolic links.</p><p>The contents are not sorted and there is no guarantee on the ordering.</p><p>Throws:</p><ul><li><code>NoSuchThing</code> if directory does not exist</li><li><code>InappropriateType</code> if file type is wrong (file)</li><li><code>InappropriateType</code> if file type is wrong (symlink to file)</li><li><code>InappropriateType</code> if file type is wrong (symlink to dir)</li><li><code>PermissionDenied</code> if directory cannot be opened</li></ul></div></div><h1id="g:9">Filetype operations</h1><divclass="top"><pclass="src"><aname="v:getFileType"class="def">getFileType</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a><ahref="HPath-IO.html#t:FileType">FileType</a><ahref="src/HPath-IO.html#getFileType"class="link">Source</a></p><divclass="doc"><p>Get the file type of the file located at the given path. Does
not follow symbolic links.</p><p>Throws:</p><ul><li><code>NoSuchThing</code> if the file does not exist</li><li><code>PermissionDenied</code> if any part of the path is not accessible</li></ul></div></div><h1id="g:10">Others</h1><divclass="top"><pclass="src"><aname="v:canonicalizePath"class="def">canonicalizePath</a> :: <ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a> -><ahref="https://hackage.haskell.org/package/base-4.8.1.0/docs/System-IO.html#t:IO">IO</a> (<ahref="HPath.html#t:Path">Path</a><ahref="HPath.html#t:Abs">Abs</a>) <ahref="src/HPath-IO.html#canonicalizePath"class="link">Source</a></p><divclass="doc"><p>Applies <code>realpath</code> on the given absolute path.</p><p>Throws:</p><ul><li><code>NoSuchThing</code> if the file at the given path does not exist</li><li><code>NoSuchThing</code> if the symlink is broken</li></ul></div></div></div></div><divid="footer"><p>Produced by <ahref="http://www.haskell.org/haddock/">Haddock</a> version 2.16.1</p></div></body></html>