| Copyright | © 2016 Julian Ospald |
|---|---|
| License | BSD3 |
| Maintainer | Julian Ospald <hasufell@posteo.de> |
| Stability | experimental |
| Portability | portable |
| Safe Haskell | Safe |
| Language | Haskell2010 |
System.Posix.FilePath
Contents
Description
The equivalent of System.FilePath on raw (byte string) file paths.
Not all functions of System.FilePath are implemented yet. Feel free to contribute!
- pathSeparator :: Word8
- isPathSeparator :: Word8 -> Bool
- searchPathSeparator :: Word8
- isSearchPathSeparator :: Word8 -> Bool
- extSeparator :: Word8
- isExtSeparator :: Word8 -> Bool
- splitExtension :: RawFilePath -> (RawFilePath, ByteString)
- takeExtension :: RawFilePath -> ByteString
- replaceExtension :: RawFilePath -> ByteString -> RawFilePath
- dropExtension :: RawFilePath -> RawFilePath
- addExtension :: RawFilePath -> ByteString -> RawFilePath
- hasExtension :: RawFilePath -> Bool
- (<.>) :: RawFilePath -> ByteString -> RawFilePath
- splitExtensions :: RawFilePath -> (RawFilePath, ByteString)
- dropExtensions :: RawFilePath -> RawFilePath
- takeExtensions :: RawFilePath -> ByteString
- splitFileName :: RawFilePath -> (RawFilePath, RawFilePath)
- takeFileName :: RawFilePath -> RawFilePath
- replaceFileName :: RawFilePath -> ByteString -> RawFilePath
- dropFileName :: RawFilePath -> RawFilePath
- takeBaseName :: RawFilePath -> ByteString
- replaceBaseName :: RawFilePath -> ByteString -> RawFilePath
- takeDirectory :: RawFilePath -> RawFilePath
- replaceDirectory :: RawFilePath -> ByteString -> RawFilePath
- combine :: RawFilePath -> RawFilePath -> RawFilePath
- (</>) :: RawFilePath -> RawFilePath -> RawFilePath
- splitPath :: RawFilePath -> [RawFilePath]
- joinPath :: [RawFilePath] -> RawFilePath
- splitDirectories :: RawFilePath -> [RawFilePath]
- normalise :: RawFilePath -> RawFilePath
- hasTrailingPathSeparator :: RawFilePath -> Bool
- addTrailingPathSeparator :: RawFilePath -> RawFilePath
- dropTrailingPathSeparator :: RawFilePath -> RawFilePath
- isRelative :: RawFilePath -> Bool
- isAbsolute :: RawFilePath -> Bool
- isValid :: RawFilePath -> Bool
- isFileName :: RawFilePath -> Bool
- hasParentDir :: RawFilePath -> Bool
- equalFilePath :: RawFilePath -> RawFilePath -> Bool
- hiddenFile :: RawFilePath -> Bool
- module System.Posix.ByteString.FilePath
Separators
Path separator character
isPathSeparator :: Word8 -> Bool Source
Check if a character is the path separator
\n -> (_chr n == '/') == isPathSeparator n
searchPathSeparator :: Word8 Source
Search path separator
isSearchPathSeparator :: Word8 -> Bool Source
Check if a character is the search path separator
\n -> (_chr n == ':') == isSearchPathSeparator n
File extension separator
isExtSeparator :: Word8 -> Bool Source
Check if a character is the file extension separator
\n -> (_chr n == '.') == isExtSeparator n
File extensions
splitExtension :: RawFilePath -> (RawFilePath, ByteString) Source
Split a RawFilePath into a path+filename and extension
>>>splitExtension "file.exe"("file",".exe")>>>splitExtension "file"("file","")>>>splitExtension "/path/file.tar.gz"("/path/file.tar",".gz")
\path -> uncurry (BS.append) (splitExtension path) == path
takeExtension :: RawFilePath -> ByteString Source
Get the final extension from a RawFilePath
>>>takeExtension "file.exe"".exe">>>takeExtension "file""">>>takeExtension "/path/file.tar.gz"".gz"
replaceExtension :: RawFilePath -> ByteString -> RawFilePath Source
Change a file's extension
\path -> let ext = takeExtension path in replaceExtension path ext == path
dropExtension :: RawFilePath -> RawFilePath Source
Drop the final extension from a RawFilePath
>>>dropExtension "file.exe""file">>>dropExtension "file""file">>>dropExtension "/path/file.tar.gz""/path/file.tar"
addExtension :: RawFilePath -> ByteString -> RawFilePath Source
Add an extension to a RawFilePath
>>>addExtension "file" ".exe""file.exe">>>addExtension "file.tar" ".gz""file.tar.gz">>>addExtension "/path/" ".ext""/path/.ext"
hasExtension :: RawFilePath -> Bool Source
Check if a RawFilePath has an extension
>>>hasExtension "file"False>>>hasExtension "file.tar"True>>>hasExtension "/path.part1/"False
(<.>) :: RawFilePath -> ByteString -> RawFilePath Source
Operator version of addExtension
splitExtensions :: RawFilePath -> (RawFilePath, ByteString) Source
Split a RawFilePath on the first extension
>>>splitExtensions "/path/file.tar.gz"("/path/file",".tar.gz")
\path -> uncurry addExtension (splitExtensions path) == path
dropExtensions :: RawFilePath -> RawFilePath Source
Remove all extensions from a RawFilePath
>>>dropExtensions "/path/file.tar.gz""/path/file"
takeExtensions :: RawFilePath -> ByteString Source
Take all extensions from a RawFilePath
>>>takeExtensions "/path/file.tar.gz"".tar.gz"
Filenames/Directory names
splitFileName :: RawFilePath -> (RawFilePath, RawFilePath) Source
Split a RawFilePath into (path,file). combine is the inverse
>>>splitFileName "path/file.txt"("path/","file.txt")>>>splitFileName "path/"("path/","")>>>splitFileName "file.txt"("./","file.txt")
\path -> uncurry combine (splitFileName path) == path || fst (splitFileName path) == "./"
takeFileName :: RawFilePath -> RawFilePath Source
Get the file name
>>>takeFileName "path/file.txt""file.txt">>>takeFileName "path/"""
replaceFileName :: RawFilePath -> ByteString -> RawFilePath Source
Change the file name
\path -> replaceFileName path (takeFileName path) == path
dropFileName :: RawFilePath -> RawFilePath Source
Drop the file name
>>>dropFileName "path/file.txt""path/">>>dropFileName "file.txt""./"
takeBaseName :: RawFilePath -> ByteString Source
Get the file name, without a trailing extension
>>>takeBaseName "path/file.tar.gz""file.tar">>>takeBaseName """"
replaceBaseName :: RawFilePath -> ByteString -> RawFilePath Source
Change the base name
>>>replaceBaseName "path/file.tar.gz" "bob""path/bob.gz"
\path -> replaceBaseName path (takeBaseName path) == path
takeDirectory :: RawFilePath -> RawFilePath Source
Get the directory, moving up one level if it's already a directory
>>>takeDirectory "path/file.txt""path">>>takeDirectory "file"".">>>takeDirectory "/path/to/""/path/to">>>takeDirectory "/path/to""/path"
replaceDirectory :: RawFilePath -> ByteString -> RawFilePath Source
Change the directory component of a RawFilePath
\path -> replaceDirectory path (takeDirectory path) `equalFilePath` path || takeDirectory path == "."
Path combinators and splitters
combine :: RawFilePath -> RawFilePath -> RawFilePath Source
Join two paths together
>>>combine "/" "file""/file">>>combine "/path/to" "file""/path/to/file">>>combine "file" "/absolute/path""/absolute/path"
(</>) :: RawFilePath -> RawFilePath -> RawFilePath Source
Operator version of combine
splitPath :: RawFilePath -> [RawFilePath] Source
Split a path into a list of components:
>>>splitPath "/path/to/file.txt"["/","path/","to/","file.txt"]
\path -> BS.concat (splitPath path) == path
joinPath :: [RawFilePath] -> RawFilePath Source
Join a split path back together
\path -> joinPath (splitPath path) == path
>>>joinPath ["path","to","file.txt"]"path/to/file.txt"
splitDirectories :: RawFilePath -> [RawFilePath] Source
Like splitPath, but without trailing slashes
>>>splitDirectories "/path/to/file.txt"["/","path","to","file.txt"]>>>splitDirectories ""[]
Path conversions
normalise :: RawFilePath -> RawFilePath Source
Normalise a file.
>>>normalise "/file/\\test////""/file/\\test/">>>normalise "/file/./test""/file/test">>>normalise "/test/file/../bob/fred/""/test/file/../bob/fred/">>>normalise "../bob/fred/""../bob/fred/">>>normalise "./bob/fred/""bob/fred/">>>normalise "./bob////.fred/./...///./..///#.""bob/.fred/.../../#.">>>normalise "."".">>>normalise "./""./">>>normalise "./.""./">>>normalise "/./""/">>>normalise "/""/">>>normalise "bob/fred/.""bob/fred/">>>normalise "//home""/home"
Trailing path separator
hasTrailingPathSeparator :: RawFilePath -> Bool Source
Check if the last character of a RawFilePath is /.
>>>hasTrailingPathSeparator "/path/"True>>>hasTrailingPathSeparator "/"True>>>hasTrailingPathSeparator "/path"False
addTrailingPathSeparator :: RawFilePath -> RawFilePath Source
Add a trailing path separator.
>>>addTrailingPathSeparator "/path""/path/">>>addTrailingPathSeparator "/path/""/path/">>>addTrailingPathSeparator "/""/"
dropTrailingPathSeparator :: RawFilePath -> RawFilePath Source
Remove a trailing path separator
>>>dropTrailingPathSeparator "/path/""/path">>>dropTrailingPathSeparator "/path////""/path">>>dropTrailingPathSeparator "/""/">>>dropTrailingPathSeparator "//""/"
Queries
isRelative :: RawFilePath -> Bool Source
Check if a path is relative
\path -> isRelative path /= isAbsolute path
isAbsolute :: RawFilePath -> Bool Source
Check if a path is absolute
>>>isAbsolute "/path"True>>>isAbsolute "path"False>>>isAbsolute ""False
isValid :: RawFilePath -> Bool Source
Is a FilePath valid, i.e. could you create a file like it?
>>>isValid ""False>>>isValid "\0"False>>>isValid "/random_ path:*"True
isFileName :: RawFilePath -> Bool Source
Is the given path a valid filename? This includes "." and "..".
>>>isFileName "lal"True>>>isFileName "."True>>>isFileName ".."True>>>isFileName ""False>>>isFileName "\0"False>>>isFileName "/random_ path:*"False
hasParentDir :: RawFilePath -> Bool Source
Check if the filepath has any parent directories in it.
>>>hasParentDir "/.."True>>>hasParentDir "foo/bar/.."True>>>hasParentDir "foo/../bar/."True>>>hasParentDir "foo/bar"False>>>hasParentDir "foo"False>>>hasParentDir ""False>>>hasParentDir ".."False
equalFilePath :: RawFilePath -> RawFilePath -> Bool Source
Equality of two filepaths. The filepaths are normalised and trailing path separators are dropped.
>>>equalFilePath "foo" "foo"True>>>equalFilePath "foo" "foo/"True>>>equalFilePath "foo" "./foo"True>>>equalFilePath "foo" "/foo"False>>>equalFilePath "foo" "FOO"False>>>equalFilePath "foo" "../foo"False
\p -> equalFilePath p p
hiddenFile :: RawFilePath -> Bool Source
Whether the file is a hidden file.
>>>hiddenFile ".foo"True>>>hiddenFile "..foo.bar"True>>>hiddenFile "some/path/.bar"True>>>hiddenFile "..."True>>>hiddenFile "dod.bar"False>>>hiddenFile "."False>>>hiddenFile ".."False>>>hiddenFile ""False