| Safe Haskell | None |
|---|---|
| Language | GHC2024 |
GHC.Data.OsPath
Synopsis
- type OsPath = OsString
- data OsString
- encodeUtf :: MonadThrow m => FilePath -> m OsPath
- decodeUtf :: MonadThrow m => OsPath -> m FilePath
- unsafeDecodeUtf :: HasCallStack => OsPath -> FilePath
- unsafeEncodeUtf :: HasCallStack => String -> OsString
- os :: String -> OsString
- (</>) :: OsPath -> OsPath -> OsPath
- (<.>) :: OsPath -> OsString -> OsPath
- splitSearchPath :: OsString -> [OsPath]
- isRelative :: OsPath -> Bool
- dropTrailingPathSeparator :: OsPath -> OsPath
- takeDirectory :: OsPath -> OsPath
- isSuffixOf :: OsString -> OsString -> Bool
- doesDirectoryExist :: OsPath -> IO Bool
- doesFileExist :: OsPath -> IO Bool
- getDirectoryContents :: OsPath -> IO [OsPath]
- createDirectoryIfMissing :: Bool -> OsPath -> IO ()
OsPath initialisation and transformation
type OsPath = OsString Source #
Type representing filenames/pathnames.
This type doesn't add any guarantees over OsString.
Newtype representing short operating system specific strings.
Internally this is either WindowsString or PosixString,
depending on the platform. Both use unpinned
ShortByteString for efficiency.
The constructor is only exported via System.OsString.Internal.Types, since dealing with the internals isn't generally recommended, but supported in case you need to write platform specific code.
Instances
| NFData OsString Source # | |||||
Defined in System.OsString.Internal.Types | |||||
| Outputable OsPath Source # | |||||
| Monoid OsString Source # | "String-Concatenation" for | ||||
| Semigroup OsString Source # | |||||
| Eq OsString Source # | Byte equality of the internal representation. | ||||
| Ord OsString Source # | Byte ordering of the internal representation. | ||||
Defined in System.OsString.Internal.Types | |||||
| Generic OsString Source # | |||||
Defined in System.OsString.Internal.Types Associated Types
| |||||
| Show OsString Source # | On windows, decodes as UCS-2. On unix prints the raw bytes without decoding. | ||||
| Lift OsString Source # | |||||
| type Rep OsString Source # | |||||
Defined in System.OsString.Internal.Types type Rep OsString = D1 ('MetaData "OsString" "System.OsString.Internal.Types" "os-string-2.0.8-inplace" 'True) (C1 ('MetaCons "OsString" 'PrefixI 'True) (S1 ('MetaSel ('Just "getOsString") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 PlatformString))) | |||||
encodeUtf :: MonadThrow m => FilePath -> m OsPath Source #
Partial unicode friendly encoding.
On windows this encodes as UTF16-LE (strictly), which is a pretty good guess. On unix this encodes as UTF8 (strictly), which is a good guess.
Throws an EncodingException if encoding fails. If the input does not
contain surrogate chars, you can use unsafeEncodeUtf.
decodeUtf :: MonadThrow m => OsPath -> m FilePath Source #
Partial unicode friendly decoding.
On windows this decodes as UTF16-LE (strictly), which is a pretty good guess. On unix this decodes as UTF8 (strictly), which is a good guess.
Throws a EncodingException if decoding fails.
unsafeDecodeUtf :: HasCallStack => OsPath -> FilePath Source #
unsafeEncodeUtf :: HasCallStack => String -> OsString Source #
Unsafe unicode friendly encoding.
Like encodeUtf, except it crashes when the input contains
surrogate chars. For sanitized input, this can be useful.
os :: String -> OsString Source #
Fallibly converts String to OsString. Only intended to be used on literals.
Common utility functions
(</>) :: OsPath -> OsPath -> OsPath Source #
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"
(<.>) :: OsPath -> OsString -> OsPath Source #
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"
splitSearchPath :: OsString -> [OsPath] Source #
Take a string, split it on the searchPathSeparator character.
On Windows, blank items are ignored on Windows, and path elements are stripped of quotes.
On Posix, blank items are converted to . on Posix, and quotes are not
treated specially.
Follows the recommendations in http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html
Windows: splitSearchPath "File1;File2;File3" == ["File1","File2","File3"] Windows: splitSearchPath "File1;;File2;File3" == ["File1","File2","File3"] Windows: splitSearchPath "File1;\"File2\";File3" == ["File1","File2","File3"] Posix: splitSearchPath "File1:File2:File3" == ["File1","File2","File3"] Posix: splitSearchPath "File1::File2:File3" == ["File1",".","File2","File3"]
isRelative :: OsPath -> Bool Source #
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."
dropTrailingPathSeparator :: OsPath -> OsPath Source #
Remove any trailing path separators
dropTrailingPathSeparator "file/test/" == "file/test"
dropTrailingPathSeparator "/" == "/"
Windows: dropTrailingPathSeparator "\\" == "\\"
Posix: not (hasTrailingPathSeparator (dropTrailingPathSeparator x)) || isDrive xtakeDirectory :: OsPath -> OsPath Source #
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:\\"isSuffixOf :: OsString -> OsString -> Bool Source #
O(n) The isSuffixOf function takes two OsStrings and returns True
iff the first is a suffix of the second.
The following holds:
isSuffixOf x y == reverse x `isPrefixOf` reverse y
Since: os-string-1.4.200.0
doesDirectoryExist :: OsPath -> IO Bool Source #
The operation doesDirectoryExist returns True if the argument file
exists and is either a directory or a symbolic link to a directory, and
False otherwise. This operation traverses symbolic links, so it can
return either True or False for them.
doesFileExist :: OsPath -> IO Bool Source #
The operation doesFileExist returns True if the argument file exists
and is not a directory, and False otherwise. This operation traverses
symbolic links, so it can return either True or False for them.
getDirectoryContents :: OsPath -> IO [OsPath] Source #
Similar to listDirectory, but always includes the special entries (.
and ..). (This applies to Windows as well.)
The operation may fail with the same exceptions as listDirectory.
createDirectoryIfMissing Source #
creates a new directory
createDirectoryIfMissing parents dirdir if it doesn't exist. If the first argument is True
the function will also create all parent directories if they are missing.