| Safe Haskell | None | 
|---|---|
| Language | Haskell2010 | 
File
Contents
Synopsis
- type FilePath = String
 - data Handle
 - stdin :: Handle
 - stdout :: Handle
 - stderr :: Handle
 - hFileSize :: MonadIO m => Handle -> m Integer
 - hGetEcho :: MonadIO m => Handle -> m Bool
 - hGetPosn :: Handle -> IO HandlePosn
 - hIsClosed :: MonadIO m => Handle -> m Bool
 - hIsEOF :: MonadIO m => Handle -> m Bool
 - hIsOpen :: MonadIO m => Handle -> m Bool
 - hIsReadable :: MonadIO m => Handle -> m Bool
 - hIsSeekable :: MonadIO m => Handle -> m Bool
 - hIsTerminalDevice :: MonadIO m => Handle -> m Bool
 - hIsWritable :: MonadIO m => Handle -> m Bool
 - hReady :: MonadIO m => Handle -> m Bool
 - hShow :: Handle -> IO String
 - hTell :: MonadIO m => Handle -> m Integer
 - hWaitForInput :: MonadIO m => Handle -> Int -> m Bool
 - hClose :: MonadIO m => Handle -> m ()
 - hFlush :: MonadIO m => Handle -> m ()
 - hSeek :: MonadIO m => Handle -> SeekMode -> Integer -> m ()
 - hSetBinaryMode :: Handle -> Bool -> IO ()
 - hSetBuffering :: MonadIO m => Handle -> BufferMode -> m ()
 - hSetEcho :: MonadIO m => Handle -> Bool -> m ()
 - hSetFileSize :: MonadIO m => Handle -> Integer -> m ()
 - hSetPosn :: HandlePosn -> IO ()
 - data BufferMode
 - data HandlePosn
 - data IOMode
 - data SeekMode
 - (</>) :: FilePath -> FilePath -> FilePath
 - makeRelative :: FilePath -> FilePath -> FilePath
 - dropTrailingPathSeparator :: FilePath -> FilePath
 - normalise :: FilePath -> FilePath
 - isAbsolute :: FilePath -> Bool
 - isRelative :: FilePath -> Bool
 - makeValid :: FilePath -> FilePath
 - isValid :: FilePath -> Bool
 - equalFilePath :: FilePath -> FilePath -> Bool
 - joinPath :: [FilePath] -> FilePath
 - splitDirectories :: FilePath -> [FilePath]
 - splitPath :: FilePath -> [FilePath]
 - combine :: FilePath -> FilePath -> FilePath
 - replaceDirectory :: FilePath -> String -> FilePath
 - takeDirectory :: FilePath -> FilePath
 - addTrailingPathSeparator :: FilePath -> FilePath
 - hasTrailingPathSeparator :: FilePath -> Bool
 - replaceBaseName :: FilePath -> String -> FilePath
 - takeBaseName :: FilePath -> String
 - takeFileName :: FilePath -> FilePath
 - dropFileName :: FilePath -> FilePath
 - replaceFileName :: FilePath -> String -> FilePath
 - splitFileName :: FilePath -> (String, String)
 - isDrive :: FilePath -> Bool
 - hasDrive :: FilePath -> Bool
 - dropDrive :: FilePath -> FilePath
 - takeDrive :: FilePath -> FilePath
 - joinDrive :: FilePath -> FilePath -> FilePath
 - splitDrive :: FilePath -> (FilePath, FilePath)
 - replaceExtensions :: FilePath -> String -> FilePath
 - takeExtensions :: FilePath -> String
 - dropExtensions :: FilePath -> FilePath
 - splitExtensions :: FilePath -> (FilePath, String)
 - stripExtension :: String -> FilePath -> Maybe FilePath
 - isExtensionOf :: String -> FilePath -> Bool
 - hasExtension :: FilePath -> Bool
 - addExtension :: FilePath -> String -> FilePath
 - dropExtension :: FilePath -> FilePath
 - (<.>) :: FilePath -> String -> FilePath
 - replaceExtension :: FilePath -> String -> FilePath
 - (-<.>) :: FilePath -> String -> FilePath
 - takeExtension :: FilePath -> String
 - splitExtension :: FilePath -> (String, String)
 - getSearchPath :: IO [FilePath]
 - splitSearchPath :: String -> [FilePath]
 - isExtSeparator :: Char -> Bool
 - extSeparator :: Char
 - isSearchPathSeparator :: Char -> Bool
 - searchPathSeparator :: Char
 - isPathSeparator :: Char -> Bool
 - pathSeparators :: [Char]
 - pathSeparator :: Char
 - module UnliftIO.Temporary
 - module UnliftIO.Directory
 
File path
File and directory names are values of type String, whose precise
 meaning is operating system dependent. Files can be opened, yielding a
 handle which can then be used to operate on the contents of that file.
File handle
Haskell defines operations to read and write characters from and to files,
 represented by values of type Handle.  Each value of this type is a
 handle: a record used by the Haskell run-time system to manage I/O
 with file system objects.  A handle has at least the following properties:
- whether it manages input or output or both;
 - whether it is open, closed or semi-closed;
 - whether the object is seekable;
 - whether buffering is disabled, or enabled on a line or block basis;
 - a buffer (whose length may be zero).
 
Most handles will also have a current I/O position indicating where the next
 input or output operation will occur.  A handle is readable if it
 manages only input or both input and output; likewise, it is writable if
 it manages only output or both input and output.  A handle is open when
 first allocated.
 Once it is closed it can no longer be used for either input or output,
 though an implementation cannot re-use its storage while references
 remain to it.  Handles are in the Show and Eq classes.  The string
 produced by showing a handle is system dependent; it should include
 enough information to identify the handle for debugging.  A handle is
 equal according to == only to itself; no attempt
 is made to compare the internal state of different handles for equality.
Standard file handles
File handle queries
hGetPosn :: Handle -> IO HandlePosn #
Computation hGetPosn hdl returns the current I/O position of
 hdl as a value of the abstract type HandlePosn.
hIsReadable :: MonadIO m => Handle -> m Bool #
Lifted version of hIsReadable
Since: unliftio-0.2.1.0
hIsSeekable :: MonadIO m => Handle -> m Bool #
Lifted version of hIsSeekable
Since: unliftio-0.2.1.0
hIsTerminalDevice :: MonadIO m => Handle -> m Bool #
Lifted version of hIsTerminalDevice
Since: unliftio-0.2.1.0
hIsWritable :: MonadIO m => Handle -> m Bool #
Lifted version of hIsWritable
Since: unliftio-0.2.1.0
hWaitForInput :: MonadIO m => Handle -> Int -> m Bool #
Lifted version of hWaitForInput
Since: unliftio-0.2.1.0
File handle operations
hSeek :: MonadIO m => Handle -> SeekMode -> Integer -> m () #
Lifted version of hSeek
Since: unliftio-0.2.1.0
hSetBinaryMode :: Handle -> Bool -> IO () #
Select binary mode (True) or text mode (False) on a open handle.
 (See also openBinaryFile.)
This has the same effect as calling hSetEncoding with char8, together
 with hSetNewlineMode with noNewlineTranslation.
hSetBuffering :: MonadIO m => Handle -> BufferMode -> m () #
Lifted version of hSetBuffering
Since: unliftio-0.2.1.0
hSetFileSize :: MonadIO m => Handle -> Integer -> m () #
Lifted version of hSetFileSize
Since: unliftio-0.2.1.0
hSetPosn :: HandlePosn -> IO () #
File handle types
data BufferMode #
Three kinds of buffering are supported: line-buffering, block-buffering or no-buffering. These modes have the following effects. For output, items are written out, or flushed, from the internal buffer according to the buffer mode:
- line-buffering: the entire output buffer is flushed
    whenever a newline is output, the buffer overflows,
    a 
hFlushis issued, or the handle is closed. - block-buffering: the entire buffer is written out whenever it
    overflows, a 
hFlushis issued, or the handle is closed. - no-buffering: output is written immediately, and never stored in the buffer.
 
An implementation is free to flush the buffer more frequently, but not less frequently, than specified above. The output buffer is emptied as soon as it has been written out.
Similarly, input occurs according to the buffer mode for the handle:
- line-buffering: when the buffer for the handle is not empty, the next item is obtained from the buffer; otherwise, when the buffer is empty, characters up to and including the next newline character are read into the buffer. No characters are available until the newline character is available or the buffer is full.
 - block-buffering: when the buffer for the handle becomes empty, the next block of data is read into the buffer.
 - no-buffering: the next input item is read and returned.
    The 
hLookAheadoperation implies that even a no-buffered handle may require a one-character buffer. 
The default buffering mode when a handle is opened is implementation-dependent and may depend on the file system object which is attached to that handle. For most implementations, physical files will normally be block-buffered and terminals will normally be line-buffered.
Constructors
| NoBuffering | buffering is disabled if possible.  | 
| LineBuffering | line-buffering should be enabled if possible.  | 
| BlockBuffering (Maybe Int) | block-buffering should be enabled if possible.
 The size of the buffer is   | 
Instances
| Eq BufferMode | |
Defined in GHC.IO.Handle.Types  | |
| Ord BufferMode | |
Defined in GHC.IO.Handle.Types Methods compare :: BufferMode -> BufferMode -> Ordering # (<) :: BufferMode -> BufferMode -> Bool # (<=) :: BufferMode -> BufferMode -> Bool # (>) :: BufferMode -> BufferMode -> Bool # (>=) :: BufferMode -> BufferMode -> Bool # max :: BufferMode -> BufferMode -> BufferMode # min :: BufferMode -> BufferMode -> BufferMode #  | |
| Read BufferMode | |
Defined in GHC.IO.Handle.Types Methods readsPrec :: Int -> ReadS BufferMode # readList :: ReadS [BufferMode] # readPrec :: ReadPrec BufferMode # readListPrec :: ReadPrec [BufferMode] #  | |
| Show BufferMode | |
Defined in GHC.IO.Handle.Types Methods showsPrec :: Int -> BufferMode -> ShowS # show :: BufferMode -> String # showList :: [BufferMode] -> ShowS #  | |
data HandlePosn #
Instances
| Eq HandlePosn | Since: base-4.1.0.0  | 
Defined in GHC.IO.Handle  | |
| Show HandlePosn | Since: base-4.1.0.0  | 
Defined in GHC.IO.Handle Methods showsPrec :: Int -> HandlePosn -> ShowS # show :: HandlePosn -> String # showList :: [HandlePosn] -> ShowS #  | |
See openFile
Constructors
| ReadMode | |
| WriteMode | |
| AppendMode | |
| ReadWriteMode | 
A mode that determines the effect of hSeek hdl mode i.
Constructors
| AbsoluteSeek | the position of   | 
| RelativeSeek | the position of   | 
| SeekFromEnd | the position of   | 
Instances
| Enum SeekMode | |
| Eq SeekMode | |
| Ord SeekMode | |
Defined in GHC.IO.Device  | |
| Read SeekMode | |
| Show SeekMode | |
| Ix SeekMode | |
Defined in GHC.IO.Device  | |
Re-exports
(</>) :: FilePath -> FilePath -> FilePath infixr 5 #
Combine two paths with a path separator.
   If the second path starts with a path separator or a drive letter, then it returns the second.
   The intention is that readFile (dir  will access the same file as
   </> file)setCurrentDirectory dir; readFile file.
Posix:   "/directory" </> "file.ext" == "/directory/file.ext"
Windows: "/directory" </> "file.ext" == "/directory\\file.ext"
         "directory" </> "/file.ext" == "/file.ext"
Valid x => (takeDirectory x </> takeFileName x) `equalFilePath` xCombined:
Posix: "/" </> "test" == "/test" Posix: "home" </> "bob" == "home/bob" Posix: "x:" </> "foo" == "x:/foo" Windows: "C:\\foo" </> "bar" == "C:\\foo\\bar" Windows: "home" </> "bob" == "home\\bob"
Not combined:
Posix: "home" </> "/bob" == "/bob" Windows: "home" </> "C:\\bob" == "C:\\bob"
Not combined (tricky):
On Windows, if a filepath starts with a single slash, it is relative to the
   root of the current drive. In [1], this is (confusingly) referred to as an
   absolute path.
   The current behavior of </> is to never combine these forms.
Windows: "home" </> "/bob" == "/bob" Windows: "home" </> "\\bob" == "\\bob" Windows: "C:\\home" </> "\\bob" == "\\bob"
On Windows, from [1]: "If a file name begins with only a disk designator
   but not the backslash after the colon, it is interpreted as a relative path
   to the current directory on the drive with the specified letter."
   The current behavior of </> is to never combine these forms.
Windows: "D:\\foo" </> "C:bar" == "C:bar" Windows: "C:\\foo" </> "C:bar" == "C:bar"
makeRelative :: FilePath -> FilePath -> FilePath #
Contract a filename, based on a relative path. Note that the resulting path
   will never introduce .. paths, as the presence of symlinks means ../b
   may not reach a/b if it starts from a/c. For a worked example see
   this blog post.
The corresponding makeAbsolute function can be found in
   System.Directory.
         makeRelative "/directory" "/directory/file.ext" == "file.ext"
         Valid x => makeRelative (takeDirectory x) x `equalFilePath` takeFileName x
         makeRelative x x == "."
         Valid x y => equalFilePath x y || (isRelative x && makeRelative y x == x) || equalFilePath (y </> makeRelative y x) x
Windows: makeRelative "C:\\Home" "c:\\home\\bob" == "bob"
Windows: makeRelative "C:\\Home" "c:/home/bob" == "bob"
Windows: makeRelative "C:\\Home" "D:\\Home\\Bob" == "D:\\Home\\Bob"
Windows: makeRelative "C:\\Home" "C:Home\\Bob" == "C:Home\\Bob"
Windows: makeRelative "/Home" "/home/bob" == "bob"
Windows: makeRelative "/" "//" == "//"
Posix:   makeRelative "/Home" "/home/bob" == "/home/bob"
Posix:   makeRelative "/home/" "/home/bob/foo/bar" == "bob/foo/bar"
Posix:   makeRelative "/fred" "bob" == "bob"
Posix:   makeRelative "/file/test" "/file/test/fred" == "fred"
Posix:   makeRelative "/file/test" "/file/test/fred/" == "fred/"
Posix:   makeRelative "some/path" "some/path/a/b/c" == "a/b/c"dropTrailingPathSeparator :: FilePath -> FilePath #
Remove any trailing path separators
dropTrailingPathSeparator "file/test/" == "file/test"
          dropTrailingPathSeparator "/" == "/"
Windows:  dropTrailingPathSeparator "\\" == "\\"
Posix:    not (hasTrailingPathSeparator (dropTrailingPathSeparator x)) || isDrive xnormalise :: FilePath -> FilePath #
Normalise a file
- // outside of the drive can be made blank
 - / -> 
pathSeparator - ./ -> ""
 
Posix:   normalise "/file/\\test////" == "/file/\\test/"
Posix:   normalise "/file/./test" == "/file/test"
Posix:   normalise "/test/file/../bob/fred/" == "/test/file/../bob/fred/"
Posix:   normalise "../bob/fred/" == "../bob/fred/"
Posix:   normalise "./bob/fred/" == "bob/fred/"
Windows: normalise "c:\\file/bob\\" == "C:\\file\\bob\\"
Windows: normalise "c:\\" == "C:\\"
Windows: normalise "C:.\\" == "C:"
Windows: normalise "\\\\server\\test" == "\\\\server\\test"
Windows: normalise "//server/test" == "\\\\server\\test"
Windows: normalise "c:/file" == "C:\\file"
Windows: normalise "/file" == "\\file"
Windows: normalise "\\" == "\\"
Windows: normalise "/./" == "\\"
         normalise "." == "."
Posix:   normalise "./" == "./"
Posix:   normalise "./." == "./"
Posix:   normalise "/./" == "/"
Posix:   normalise "/" == "/"
Posix:   normalise "bob/fred/." == "bob/fred/"
Posix:   normalise "//home" == "/home"isAbsolute :: FilePath -> Bool #
not . isRelativeisAbsolute x == not (isRelative x)
isRelative :: FilePath -> Bool #
Is a path relative, or is it fixed to the root?
Windows: isRelative "path\\test" == True Windows: isRelative "c:\\test" == False Windows: isRelative "c:test" == True Windows: isRelative "c:\\" == False Windows: isRelative "c:/" == False Windows: isRelative "c:" == True Windows: isRelative "\\\\foo" == False Windows: isRelative "\\\\?\\foo" == False Windows: isRelative "\\\\?\\UNC\\foo" == False Windows: isRelative "/foo" == True Windows: isRelative "\\foo" == True Posix: isRelative "test/path" == True Posix: isRelative "/test" == False Posix: isRelative "/" == False
According to [1]:
- "A UNC name of any format [is never relative]."
 - "You cannot use the "\?" prefix with a relative path."
 
makeValid :: FilePath -> FilePath #
Take a FilePath and make it valid; does not change already valid FilePaths.
isValid (makeValid x) isValid x ==> makeValid x == x makeValid "" == "_" makeValid "file\0name" == "file_name" Windows: makeValid "c:\\already\\/valid" == "c:\\already\\/valid" Windows: makeValid "c:\\test:of_test" == "c:\\test_of_test" Windows: makeValid "test*" == "test_" Windows: makeValid "c:\\test\\nul" == "c:\\test\\nul_" Windows: makeValid "c:\\test\\prn.txt" == "c:\\test\\prn_.txt" Windows: makeValid "c:\\test/prn.txt" == "c:\\test/prn_.txt" Windows: makeValid "c:\\nul\\file" == "c:\\nul_\\file" Windows: makeValid "\\\\\\foo" == "\\\\drive" Windows: makeValid "\\\\?\\D:file" == "\\\\?\\D:\\file" Windows: makeValid "nul .txt" == "nul _.txt"
Is a FilePath valid, i.e. could you create a file like it? This function checks for invalid names, and invalid characters, but does not check if length limits are exceeded, as these are typically filesystem dependent.
         isValid "" == False
         isValid "\0" == False
Posix:   isValid "/random_ path:*" == True
Posix:   isValid x == not (null x)
Windows: isValid "c:\\test" == True
Windows: isValid "c:\\test:of_test" == False
Windows: isValid "test*" == False
Windows: isValid "c:\\test\\nul" == False
Windows: isValid "c:\\test\\prn.txt" == False
Windows: isValid "c:\\nul\\file" == False
Windows: isValid "\\\\" == False
Windows: isValid "\\\\\\foo" == False
Windows: isValid "\\\\?\\D:file" == False
Windows: isValid "foo\tbar" == False
Windows: isValid "nul .txt" == False
Windows: isValid " nul.txt" == TrueequalFilePath :: FilePath -> FilePath -> Bool #
Equality of two FilePaths.
   If you call System.Directory.canonicalizePath
   first this has a much better chance of working.
   Note that this doesn't follow symlinks or DOSNAM~1s.
         x == y ==> equalFilePath x y
         normalise x == normalise y ==> equalFilePath x y
         equalFilePath "foo" "foo/"
         not (equalFilePath "foo" "/foo")
Posix:   not (equalFilePath "foo" "FOO")
Windows: equalFilePath "foo" "FOO"
Windows: not (equalFilePath "C:" "C:/")joinPath :: [FilePath] -> FilePath #
Join path elements back together.
joinPath ["/","directory/","file.ext"] == "/directory/file.ext" Valid x => joinPath (splitPath x) == x joinPath [] == "" Posix: joinPath ["test","file","path"] == "test/file/path"
splitDirectories :: FilePath -> [FilePath] #
Just as splitPath, but don't add the trailing slashes to each element.
         splitDirectories "/directory/file.ext" == ["/","directory","file.ext"]
         splitDirectories "test/file" == ["test","file"]
         splitDirectories "/test/file" == ["/","test","file"]
Windows: splitDirectories "C:\\test\\file" == ["C:\\", "test", "file"]
         Valid x => joinPath (splitDirectories x) `equalFilePath` x
         splitDirectories "" == []
Windows: splitDirectories "C:\\test\\\\\\file" == ["C:\\", "test", "file"]
         splitDirectories "/test///file" == ["/","test","file"]splitPath :: FilePath -> [FilePath] #
Split a path by the directory separator.
splitPath "/directory/file.ext" == ["/","directory/","file.ext"] concat (splitPath x) == x splitPath "test//item/" == ["test//","item/"] splitPath "test/item/file" == ["test/","item/","file"] splitPath "" == [] Windows: splitPath "c:\\test\\path" == ["c:\\","test\\","path"] Posix: splitPath "/file/test" == ["/","file/","test"]
replaceDirectory :: FilePath -> String -> FilePath #
Set the directory, keeping the filename the same.
replaceDirectory "root/file.ext" "/directory/" == "/directory/file.ext" Valid x => replaceDirectory x (takeDirectory x) `equalFilePath` x
takeDirectory :: FilePath -> FilePath #
Get the directory name, move up one level.
          takeDirectory "/directory/other.ext" == "/directory"
          takeDirectory x `isPrefixOf` x || takeDirectory x == "."
          takeDirectory "foo" == "."
          takeDirectory "/" == "/"
          takeDirectory "/foo" == "/"
          takeDirectory "/foo/bar/baz" == "/foo/bar"
          takeDirectory "/foo/bar/baz/" == "/foo/bar/baz"
          takeDirectory "foo/bar/baz" == "foo/bar"
Windows:  takeDirectory "foo\\bar" == "foo"
Windows:  takeDirectory "foo\\bar\\\\" == "foo\\bar"
Windows:  takeDirectory "C:\\" == "C:\\"addTrailingPathSeparator :: FilePath -> FilePath #
Add a trailing file path separator if one is not already present.
hasTrailingPathSeparator (addTrailingPathSeparator x) hasTrailingPathSeparator x ==> addTrailingPathSeparator x == x Posix: addTrailingPathSeparator "test/rest" == "test/rest/"
hasTrailingPathSeparator :: FilePath -> Bool #
Is an item either a directory or the last character a path separator?
hasTrailingPathSeparator "test" == False hasTrailingPathSeparator "test/" == True
replaceBaseName :: FilePath -> String -> FilePath #
Set the base name.
replaceBaseName "/directory/other.ext" "file" == "/directory/file.ext" replaceBaseName "file/test.txt" "bob" == "file/bob.txt" replaceBaseName "fred" "bill" == "bill" replaceBaseName "/dave/fred/bob.gz.tar" "new" == "/dave/fred/new.tar" Valid x => replaceBaseName x (takeBaseName x) == x
takeBaseName :: FilePath -> String #
Get the base name, without an extension or path.
takeBaseName "/directory/file.ext" == "file" takeBaseName "file/test.txt" == "test" takeBaseName "dave.ext" == "dave" takeBaseName "" == "" takeBaseName "test" == "test" takeBaseName (addTrailingPathSeparator x) == "" takeBaseName "file/file.tar.gz" == "file.tar"
takeFileName :: FilePath -> FilePath #
Get the file name.
takeFileName "/directory/file.ext" == "file.ext" takeFileName "test/" == "" takeFileName x `isSuffixOf` x takeFileName x == snd (splitFileName x) Valid x => takeFileName (replaceFileName x "fred") == "fred" Valid x => takeFileName (x </> "fred") == "fred" Valid x => isRelative (takeFileName x)
dropFileName :: FilePath -> FilePath #
Drop the filename. Unlike takeDirectory, this function will leave
   a trailing path separator on the directory.
dropFileName "/directory/file.ext" == "/directory/" dropFileName x == fst (splitFileName x)
replaceFileName :: FilePath -> String -> FilePath #
Set the filename.
replaceFileName "/directory/other.txt" "file.ext" == "/directory/file.ext" Valid x => replaceFileName x (takeFileName x) == x
splitFileName :: FilePath -> (String, String) #
Split a filename into directory and file. </> is the inverse.
   The first component will often end with a trailing slash.
splitFileName "/directory/file.ext" == ("/directory/","file.ext")
Valid x => uncurry (</>) (splitFileName x) == x || fst (splitFileName x) == "./"
Valid x => isValid (fst (splitFileName x))
splitFileName "file/bob.txt" == ("file/", "bob.txt")
splitFileName "file/" == ("file/", "")
splitFileName "bob" == ("./", "bob")
Posix:   splitFileName "/" == ("/","")
Windows: splitFileName "c:" == ("c:","")Is an element a drive
Posix:   isDrive "/" == True
Posix:   isDrive "/foo" == False
Windows: isDrive "C:\\" == True
Windows: isDrive "C:\\foo" == False
         isDrive "" == FalsehasDrive :: FilePath -> Bool #
Does a path have a drive.
not (hasDrive x) == null (takeDrive x)
Posix:   hasDrive "/foo" == True
Windows: hasDrive "C:\\foo" == True
Windows: hasDrive "C:foo" == True
         hasDrive "foo" == False
         hasDrive "" == FalsejoinDrive :: FilePath -> FilePath -> FilePath #
Join a drive and the rest of the path.
Valid x => uncurry joinDrive (splitDrive x) == x Windows: joinDrive "C:" "foo" == "C:foo" Windows: joinDrive "C:\\" "bar" == "C:\\bar" Windows: joinDrive "\\\\share" "foo" == "\\\\share\\foo" Windows: joinDrive "/:" "foo" == "/:\\foo"
splitDrive :: FilePath -> (FilePath, FilePath) #
Split a path into a drive and a path. On Posix, / is a Drive.
uncurry (++) (splitDrive x) == x
Windows: splitDrive "file" == ("","file")
Windows: splitDrive "c:/file" == ("c:/","file")
Windows: splitDrive "c:\\file" == ("c:\\","file")
Windows: splitDrive "\\\\shared\\test" == ("\\\\shared\\","test")
Windows: splitDrive "\\\\shared" == ("\\\\shared","")
Windows: splitDrive "\\\\?\\UNC\\shared\\file" == ("\\\\?\\UNC\\shared\\","file")
Windows: splitDrive "\\\\?\\UNCshared\\file" == ("\\\\?\\","UNCshared\\file")
Windows: splitDrive "\\\\?\\d:\\file" == ("\\\\?\\d:\\","file")
Windows: splitDrive "/d" == ("","/d")
Posix:   splitDrive "/test" == ("/","test")
Posix:   splitDrive "//test" == ("//","test")
Posix:   splitDrive "test/file" == ("","test/file")
Posix:   splitDrive "file" == ("","file")replaceExtensions :: FilePath -> String -> FilePath #
Replace all extensions of a file with a new extension. Note
   that replaceExtension and addExtension both work for adding
   multiple extensions, so only required when you need to drop
   all extensions first.
replaceExtensions "file.fred.bob" "txt" == "file.txt" replaceExtensions "file.fred.bob" "tar.gz" == "file.tar.gz"
takeExtensions :: FilePath -> String #
Get all extensions.
takeExtensions "/directory/path.ext" == ".ext" takeExtensions "file.tar.gz" == ".tar.gz"
dropExtensions :: FilePath -> FilePath #
Drop all extensions.
dropExtensions "/directory/path.ext" == "/directory/path" dropExtensions "file.tar.gz" == "file" not $ hasExtension $ dropExtensions x not $ any isExtSeparator $ takeFileName $ dropExtensions x
splitExtensions :: FilePath -> (FilePath, String) #
Split on all extensions.
splitExtensions "/directory/path.ext" == ("/directory/path",".ext")
splitExtensions "file.tar.gz" == ("file",".tar.gz")
uncurry (++) (splitExtensions x) == x
Valid x => uncurry addExtension (splitExtensions x) == x
splitExtensions "file.tar.gz" == ("file",".tar.gz")stripExtension :: String -> FilePath -> Maybe FilePath #
Drop the given extension from a FilePath, and the "." preceding it.
   Returns Nothing if the FilePath does not have the given extension, or
   Just and the part before the extension if it does.
This function can be more predictable than dropExtensions, especially if the filename
   might itself contain . characters.
stripExtension "hs.o" "foo.x.hs.o" == Just "foo.x" stripExtension "hi.o" "foo.x.hs.o" == Nothing dropExtension x == fromJust (stripExtension (takeExtension x) x) dropExtensions x == fromJust (stripExtension (takeExtensions x) x) stripExtension ".c.d" "a.b.c.d" == Just "a.b" stripExtension ".c.d" "a.b..c.d" == Just "a.b." stripExtension "baz" "foo.bar" == Nothing stripExtension "bar" "foobar" == Nothing stripExtension "" x == Just x
isExtensionOf :: String -> FilePath -> Bool #
Does the given filename have the specified extension?
"png" `isExtensionOf` "/directory/file.png" == True ".png" `isExtensionOf` "/directory/file.png" == True ".tar.gz" `isExtensionOf` "bar/foo.tar.gz" == True "ar.gz" `isExtensionOf` "bar/foo.tar.gz" == False "png" `isExtensionOf` "/directory/file.png.jpg" == False "csv/table.csv" `isExtensionOf` "/data/csv/table.csv" == False
hasExtension :: FilePath -> Bool #
Does the given filename have an extension?
hasExtension "/directory/path.ext" == True hasExtension "/directory/path" == False null (takeExtension x) == not (hasExtension x)
addExtension :: FilePath -> String -> FilePath #
Add an extension, even if there is already one there, equivalent to <.>.
addExtension "/directory/path" "ext" == "/directory/path.ext" addExtension "file.txt" "bib" == "file.txt.bib" addExtension "file." ".bib" == "file..bib" addExtension "file" ".bib" == "file.bib" addExtension "/" "x" == "/.x" addExtension x "" == x Valid x => takeFileName (addExtension (addTrailingPathSeparator x) "ext") == ".ext" Windows: addExtension "\\\\share" ".txt" == "\\\\share\\.txt"
dropExtension :: FilePath -> FilePath #
Remove last extension, and the "." preceding it.
dropExtension "/directory/path.ext" == "/directory/path" dropExtension x == fst (splitExtension x)
(<.>) :: FilePath -> String -> FilePath infixr 7 #
Add an extension, even if there is already one there, equivalent to addExtension.
"/directory/path" <.> "ext" == "/directory/path.ext" "/directory/path" <.> ".ext" == "/directory/path.ext"
replaceExtension :: FilePath -> String -> FilePath #
Set the extension of a file, overwriting one if already present, equivalent to -<.>.
replaceExtension "/directory/path.txt" "ext" == "/directory/path.ext" replaceExtension "/directory/path.txt" ".ext" == "/directory/path.ext" replaceExtension "file.txt" ".bob" == "file.bob" replaceExtension "file.txt" "bob" == "file.bob" replaceExtension "file" ".bob" == "file.bob" replaceExtension "file.txt" "" == "file" replaceExtension "file.fred.bob" "txt" == "file.fred.txt" replaceExtension x y == addExtension (dropExtension x) y
(-<.>) :: FilePath -> String -> FilePath infixr 7 #
Remove the current extension and add another, equivalent to replaceExtension.
"/directory/path.txt" -<.> "ext" == "/directory/path.ext" "/directory/path.txt" -<.> ".ext" == "/directory/path.ext" "foo.o" -<.> "c" == "foo.c"
takeExtension :: FilePath -> String #
Get the extension of a file, returns "" for no extension, .ext otherwise.
takeExtension "/directory/path.ext" == ".ext" takeExtension x == snd (splitExtension x) Valid x => takeExtension (addExtension x "ext") == ".ext" Valid x => takeExtension (replaceExtension x "ext") == ".ext"
splitExtension :: FilePath -> (String, String) #
Split on the extension. addExtension is the inverse.
splitExtension "/directory/path.ext" == ("/directory/path",".ext")
uncurry (++) (splitExtension x) == x
Valid x => uncurry addExtension (splitExtension x) == x
splitExtension "file.txt" == ("file",".txt")
splitExtension "file" == ("file","")
splitExtension "file/file.txt" == ("file/file",".txt")
splitExtension "file.txt/boris" == ("file.txt/boris","")
splitExtension "file.txt/boris.ext" == ("file.txt/boris",".ext")
splitExtension "file/path.txt.bob.fred" == ("file/path.txt.bob",".fred")
splitExtension "file/path.txt/" == ("file/path.txt/","")getSearchPath :: IO [FilePath] #
Get a list of FilePaths in the $PATH variable.
splitSearchPath :: String -> [FilePath] #
Take a string, split it on the searchPathSeparator character.
   Blank items are ignored on Windows, and converted to . on Posix.
   On Windows path elements are stripped of quotes.
Follows the recommendations in http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html
Posix: splitSearchPath "File1:File2:File3" == ["File1","File2","File3"] Posix: splitSearchPath "File1::File2:File3" == ["File1",".","File2","File3"] Windows: splitSearchPath "File1;File2;File3" == ["File1","File2","File3"] Windows: splitSearchPath "File1;;File2;File3" == ["File1","File2","File3"] Windows: splitSearchPath "File1;\"File2\";File3" == ["File1","File2","File3"]
isExtSeparator :: Char -> Bool #
Is the character an extension character?
isExtSeparator a == (a == extSeparator)
extSeparator :: Char #
File extension character
extSeparator == '.'
isSearchPathSeparator :: Char -> Bool #
Is the character a file separator?
isSearchPathSeparator a == (a == searchPathSeparator)
The character that is used to separate the entries in the $PATH environment variable.
Windows: searchPathSeparator == ';' Posix: searchPathSeparator == ':'
isPathSeparator :: Char -> Bool #
Rather than using (== , use this. Test if something
   is a path separator.pathSeparator)
isPathSeparator a == (a `elem` pathSeparators)
pathSeparators :: [Char] #
The list of all possible separators.
Windows: pathSeparators == ['\\', '/'] Posix: pathSeparators == ['/'] pathSeparator `elem` pathSeparators
pathSeparator :: Char #
The character that separates directories. In the case where more than
   one character is possible, pathSeparator is the 'ideal' one.
Windows: pathSeparator == '\\' Posix: pathSeparator == '/' isPathSeparator pathSeparator
module UnliftIO.Temporary
module UnliftIO.Directory