| MissingH-1.1.0.3: Large utility library | Source code | Contents | Index

System.IO.HVFS

Portability | portable
Stability | provisional
Maintainer | John Goerzen <jgoerzen@complete.org>

Contents

Implementation Classes / Types
Re-exported types from other modules

Description

Haskell Virtual FS -- generic support for real or virtual filesystem in Haskell

Copyright (c) 2004-2005 John Goerzen, jgoerzen@complete.org

The idea of this module is to provide virtualization of filesystem calls. In addition to the "real" system filesystem, you can also provide access to other, virtual, filesystems using the same set of calls. Examples of such virtual filesystems might include a remote FTP server, WebDAV server, a local Hashtable, a ConfigParser object, or any other data structure you can represent as a tree of named nodes containing strings.

Each `HVFS` function takes a `HVFS` "handle" (`HVFS` instance) as its first parameter. If you wish to operate on the standard system filesystem, you can just use `SystemFS`.

The MissingH.HVFS.IO.InstanceHelpers module contains some code to help you make your own HVFS instances.

The `HVFSOpenable` class works together with the System.IO.HVIO module to provide a complete virtual filesystem and I/O model that allows you to open up virtual filesystem files and act upon them in a manner similar to standard Handles.

Synopsis

class Show a => HVFS a where

vGetCurrentDirectory :: a -> IO FilePath
vSetCurrentDirectory :: a -> FilePath -> IO ()
vGetDirectoryContents :: a -> FilePath -> IO [FilePath]
vDoesFileExist :: a -> FilePath -> IO Bool
vDoesDirectoryExist :: a -> FilePath -> IO Bool
vDoesExist :: a -> FilePath -> IO Bool
vCreateDirectory :: a -> FilePath -> IO ()
vRemoveDirectory :: a -> FilePath -> IO ()
vRenameDirectory :: a -> FilePath -> FilePath -> IO ()
vRemoveFile :: a -> FilePath -> IO ()
vRenameFile :: a -> FilePath -> FilePath -> IO ()
vGetFileStatus :: a -> FilePath -> IO HVFSStatEncap
vGetSymbolicLinkStatus :: a -> FilePath -> IO HVFSStatEncap
vGetModificationTime :: a -> FilePath -> IO ClockTime
vRaiseError :: a -> IOErrorType -> String -> Maybe FilePath -> IO c
vCreateSymbolicLink :: a -> FilePath -> FilePath -> IO ()
vReadSymbolicLink :: a -> FilePath -> IO FilePath
vCreateLink :: a -> FilePath -> FilePath -> IO ()

class Show a => HVFSStat a where

vDeviceID :: a -> DeviceID
vFileID :: a -> FileID
vFileMode :: a -> FileMode
vLinkCount :: a -> LinkCount
vFileOwner :: a -> UserID
vFileGroup :: a -> GroupID
vSpecialDeviceID :: a -> DeviceID
vFileSize :: a -> FileOffset
vAccessTime :: a -> EpochTime
vModificationTime :: a -> EpochTime
vStatusChangeTime :: a -> EpochTime
vIsBlockDevice :: a -> Bool
vIsCharacterDevice :: a -> Bool
vIsNamedPipe :: a -> Bool
vIsRegularFile :: a -> Bool
vIsDirectory :: a -> Bool
vIsSymbolicLink :: a -> Bool
vIsSocket :: a -> Bool

class HVFS a => HVFSOpenable a where

vOpen :: a -> FilePath -> IOMode -> IO HVFSOpenEncap
vReadFile :: a -> FilePath -> IO String
vWriteFile :: a -> FilePath -> String -> IO ()
vOpenBinaryFile :: a -> FilePath -> IOMode -> IO HVFSOpenEncap

data HVFSOpenEncap = forall a . HVIO a => HVFSOpenEncap a
data HVFSStatEncap = forall a . HVFSStat a => HVFSStatEncap a
withStat :: forall b. HVFSStatEncap -> (forall a. HVFSStat a => a -> b) -> b
withOpen :: forall b. HVFSOpenEncap -> (forall a. HVIO a => a -> b) -> b
data SystemFS = SystemFS
FilePath
DeviceID
FileID
FileMode
LinkCount
UserID
GroupID
FileOffset
EpochTime
IOMode (ReadMode, WriteMode, AppendMode, ReadWriteMode)

Implementation Classes / Types

class Show a => HVFS a where | Source

The main HVFS class.

Default implementations of these functions are provided:

- `vGetModificationTime` -- implemented in terms of `vGetFileStatus`
- `vRaiseError`
- `vDoesFileExist` -- implemented in terms of `vGetFileStatus`
- `vDoesDirectoryExist` -- implemented in terms of `vGetFileStatus`
- `vDoesExist` -- implemented in terms of `vGetSymbolicLinkStatus`
- `vGetSymbolicLinkStatus` -- set to call `vGetFileStatus`.

Default implementations of all other functions will generate an isIllegalOperation error, since they are assumed to be un-implemented.

You should always provide at least a `vGetFileStatus` call, and almost certainly several of the others.

Most of these functions correspond to functions in System.Directory or System.Posix.Files. Please see detailed documentation on them there.

Methods

vGetCurrentDirectory :: a -> IO FilePath | Source

vSetCurrentDirectory :: a -> FilePath -> IO () | Source

vGetDirectoryContents :: a -> FilePath -> IO [FilePath] | Source

vDoesFileExist :: a -> FilePath -> IO Bool | Source

vDoesDirectoryExist :: a -> FilePath -> IO Bool | Source

vDoesExist :: a -> FilePath -> IO Bool | Source

True if the file exists, regardless of what type it is. This is even True if the given path is a broken symlink.

vCreateDirectory :: a -> FilePath -> IO () | Source

vRemoveDirectory :: a -> FilePath -> IO () | Source

vRenameDirectory :: a -> FilePath -> FilePath -> IO () | Source

vRemoveFile :: a -> FilePath -> IO () | Source

vRenameFile :: a -> FilePath -> FilePath -> IO () | Source

vGetFileStatus :: a -> FilePath -> IO HVFSStatEncap | Source

vGetSymbolicLinkStatus :: a -> FilePath -> IO HVFSStatEncap | Source

vGetModificationTime :: a -> FilePath -> IO ClockTime | Source

vRaiseError :: a -> IOErrorType -> String -> Maybe FilePath -> IO c | Source

Raise an error relating to actions on this class.

vCreateSymbolicLink :: a -> FilePath -> FilePath -> IO () | Source

vReadSymbolicLink :: a -> FilePath -> IO FilePath | Source

vCreateLink :: a -> FilePath -> FilePath -> IO () | Source

Instances

HVFS SystemFS
HVFS MemoryVFS
HVFS a => HVFS (HVFSChroot a)
HVFS a => HVFS (HVFSReadOnly a)

class Show a => HVFSStat a where | Source

Evaluating types of files and information about them. This corresponds to the System.Posix.Types.FileStatus type, and indeed, that is one instance of this class. Inplementators must, at minimum, implement `vIsDirectory` and `vIsRegularFile`. Default implementations of everything else are provided, returning reasonable values. A default implementation of this is not currently present on Windows.
Methods

vDeviceID :: a -> DeviceID | Source

vFileID :: a -> FileID | Source

vFileMode :: a -> FileMode | Source

Refers to file permissions, NOT the st_mode field from stat(2)

vLinkCount :: a -> LinkCount | Source

vFileOwner :: a -> UserID | Source

vFileGroup :: a -> GroupID | Source

vSpecialDeviceID :: a -> DeviceID | Source

vFileSize :: a -> FileOffset | Source

vAccessTime :: a -> EpochTime | Source

vModificationTime :: a -> EpochTime | Source

vStatusChangeTime :: a -> EpochTime | Source

vIsBlockDevice :: a -> Bool | Source

vIsCharacterDevice :: a -> Bool | Source

vIsNamedPipe :: a -> Bool | Source

vIsRegularFile :: a -> Bool | Source

vIsDirectory :: a -> Bool | Source

vIsSymbolicLink :: a -> Bool | Source

vIsSocket :: a -> Bool | Source

Instances

HVFSStat FileStatus
HVFSStat SimpleStat

class HVFS a => HVFSOpenable a where | Source

Types that can open a HVIO object should be instances of this class. You need only implement `vOpen`.
Methods

vOpen :: a -> FilePath -> IOMode -> IO HVFSOpenEncap | Source

vReadFile :: a -> FilePath -> IO String | Source

vWriteFile :: a -> FilePath -> String -> IO () | Source

vOpenBinaryFile :: a -> FilePath -> IOMode -> IO HVFSOpenEncap | Source

Instances

HVFSOpenable SystemFS
HVFSOpenable MemoryVFS
HVFSOpenable a => HVFSOpenable (HVFSChroot a)
HVFSOpenable a => HVFSOpenable (HVFSReadOnly a)

data HVFSOpenEncap | Source

Similar to `HVFSStatEncap`, but for `vOpen` result.
Constructors

forall a . HVIO a => HVFSOpenEncap a |

data HVFSStatEncap | Source

Encapsulate a `HVFSStat` result. This is required due to Haskell typing restrictions. You can get at it with:

     case encap of
        HVFSStatEncap x -> -- now use x

Constructors

forall a . HVFSStat a => HVFSStatEncap a |

withStat :: forall b. HVFSStatEncap -> (forall a. HVFSStat a => a -> b) -> b | Source

Convenience function for working with stat -- takes a stat result and a function that uses it, and returns the result.

Here is an example from the HVFS source:

        vGetModificationTime fs fp =
           do s <- vGetFileStatus fs fp
              return $ epochToClockTime (withStat s vModificationTime)

See `epochToClockTime` for more information.

withOpen :: forall b. HVFSOpenEncap -> (forall a. HVIO a => a -> b) -> b | Source

Similar to `withStat`, but for the `vOpen` result.

data SystemFS | Source

Constructors

SystemFS |

Instances

Eq SystemFS
Show SystemFS
HVFSOpenable SystemFS
HVFS SystemFS

Re-exported types from other modules
FilePath
DeviceID
FileID
FileMode
LinkCount
UserID
GroupID
FileOffset
EpochTime
IOMode (ReadMode, WriteMode, AppendMode, ReadWriteMode)
Produced by Haddock version 2.4.2