Type representing filenames/pathnames.
This type doesn't add any guarantees over OsString.
:: a typeCtrl KGHC 9.14.1 · lts/ghc-9.14.x · 45dd537 · 2026-10-11
Moduleghc-lib-parser-9.14.1.20251220GHC2021
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.
Eq OsStringDefined in os-string-2.0.8 · System.OsString.Internal.TypesByte equality of the internal representation.
Ord OsStringDefined in os-string-2.0.8 · System.OsString.Internal.TypesByte ordering of the internal representation.
Show OsStringDefined in os-string-2.0.8 · System.OsString.Internal.TypesOn windows, decodes as UCS-2. On unix prints the raw bytes without decoding.
Generic OsStringDefined in os-string-2.0.8 · System.OsString.Internal.TypesSemigroup OsStringDefined in os-string-2.0.8 · System.OsString.Internal.TypesMonoid OsStringDefined in os-string-2.0.8 · System.OsString.Internal.Types"String-Concatenation" for OsString. This is not the same
as (</>).
NFData OsStringDefined in os-string-2.0.8 · System.OsString.Internal.TypesLift OsStringDefined in os-string-2.0.8 · System.OsString.Internal.Typestype Rep OsString = D1 ('MetaData "OsString"
"System.OsString.Internal.Types"
"os-string-2.0.8-7fdb"
'True) (C1 ('MetaCons "OsString"
'PrefixI 'True) (S1 ('MetaSel ('Just "getOsString"
) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 PlatformString)))Defined in os-string-2.0.8 · System.OsString.Internal.TypesPartial 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.
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.
Unsafe unicode friendly encoding.
Like encodeUtf, except it crashes when the input contains surrogate chars. For sanitized input, this can be useful.
Fallibly converts String to OsString. Only intended to be used on literals.
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 </> file) will access the same file as
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"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"