In favour of


Library for manipulating RawFilePaths in a cross platform way.

Version on this page:
LTS Haskell 22.23:
Stackage Nightly 2023-12-26:
Latest on Hackage:

See all snapshots filepath-bytestring appears in

BSD-3-Clause licensed by Neil Mitchell
Maintained by Joey Hess
This version can be pinned in stack with:filepath-bytestring-,2848

Module documentation for

Depends on 3 packages(full list with versions):
Used by 2 packages in lts-18.28(full list with versions):

FilePath Hackage version Linux build status Windows build status

The filepath-bytestring package provides functionality for manipulating RawFilePath values (ByteStrings). Its interface is equivilant to the filepath package. It provides three modules:

All three modules provide the same API, and the same documentation (calling out differences in the different variants).

Developer notes

This package’s version should be the same as the filepath it’s derived from, with an added revision number.

Most of the code is in System/FilePath/Internal.hs which is #include‘d into both System/FilePath/Posix.hs and System/FilePath/Windows.hs with the IS_WINDOWS CPP define set to either True or False. This Internal module is a bit weird in that it isn’t really a Haskell module, but is more an include file.

The library has extensive doc tests. Anything starting with -- > is transformed into a doc test as a predicate that must evaluate to True. These tests follow a few rules:

  • Tests prefixed with Windows: or Posix: are only tested against that specific implementation - otherwise tests are run against both implementations.
  • Any single letter variable, e.g. x, is considered universal quantification, and is checked with QuickCheck.
  • If Valid x => appears at the start of a doc test, that means the property will only be tested with x passing the isValid predicate.

Also, all exported functions are quickchecked against the ones from filepath to make sure thay generate equivilant results.

The tests can be generated by Generate.hs in the root of the repo, and will be placed in tests/TestGen.hs. The TestGen.hs file is checked into the repo, and the CI scripts check that TestGen.hs is in sync with what would be generated a fresh - if you don’t regenerate TestGen.hs the CI will fail.

The .ghci file is set up to allow you to type ghci to open the library, then :go will regenerate the tests and run them.