The Haskell 98 Report
top | back | next | contents | function index


22  ディレクトリ関数


module Directory ( 
    Permissions( Permissions, readable, writable, executable, searchable ), 
    createDirectory, removeDirectory, removeFile, 
    renameDirectory, renameFile, getDirectoryContents,
    getCurrentDirectory, setCurrentDirectory,
    doesFileExist, doesDirectoryExist,
    getPermissions, setPermissions,
    getModificationTime ) where

import Time ( ClockTime )

data Permissions = Permissions {
readable,   writable,
executable, searchable :: Bool
   }

instance Eq   Permissions where ...
instance Ord  Permissions where ...
instance Read Permissions where ...
instance Show Permissions where ...



createDirectory  :: FilePath -> IO ()
removeDirectory  :: FilePath -> IO ()
removeFile  :: FilePath -> IO ()
renameDirectory  :: FilePath -> FilePath -> IO ()
renameFile  :: FilePath -> FilePath -> IO ()

getDirectoryContents  :: FilePath -> IO [FilePath]
getCurrentDirectory  :: IO FilePath
setCurrentDirectory  :: FilePath -> IO ()

doesFileExist :: FilePath -> IO Bool
doesDirectoryExist :: FilePath -> IO Bool

getPermissions :: FilePath -> IO Permissions
setPermissions :: FilePath -> Permissions -> IO ()

getModificationTime :: FilePath -> IO ClockTime

これらの関数はファイルシステム上のディレクトリを操作するものである。

Directory 操作はどれも 21.1 節 で説明したように isIllegalOperationError を起こすことがある。 これ以外の許可属性エラーについては以下に説明する。もし、ある操作が実 装されない場合には isIllegalOperationError を起こさなければ ならないことに特に注意すること。 ディレクトリには一連のエントリがあり、それぞれはファイルシステムオブ ジェクト(ファイル、ディレクトリ、その他)への名前付参照になっている。 いくつかのエントリは隠されていたり、アクセス不可であったり、あるいは 管理上の機能を持つもの(たとえば、POSIX の"."や"..")であるが、これらの エントリのすべてはディレクトリ内容の一部を形成するものと考える。しか しながら、サブディレクトリ内のエントリは当該ディレクトリの一部を形成 するとは考えない。ファイルシステムオブジェクトにはファイルやディレク トリ以外のものも存在するであろうが、このライブラリでは物理的ファイル とディレクトリ以外のオブジェクトを区別しない。それゆえ、こうしたオブ ジェクトはすべてファイルとして扱われるべきである。

各ファイルシステムオブジェクトはパスによって参照される。各ファ イルシステムオブジェクトには通常、最低でも 1 つ絶対パスが割り当てられ ている。ファイルオブジェクトはカレントディレクトリからの相対パスをも つというオペレーティングシステムもある。

createDirectory dir 計算は新しい空もしくはそのオペレー ティングシステムが認めるほとんど空のディレクトリ dir を作る。

エラーについて: createDirectory 計算はユーザがディレク トリを作成する権限を持たなければ、isPermissionError で失敗し、 ディレクトリが既に存在すれば、isAlreadyExistsError で失敗す る。また、新しいディレクトリの親ディレクトリが存在しなければ、 isDoesNotExistErrorで失敗する。

removeDirectory dir 計算は既存のディレクトリ dir を削除する。実装はディレクトリを削除する前に満さなければな らない制限(たとえば、ディレクトリは空でなければならない、ディレクトリ が他のプロセスで使用中であってはならないなど)を付加してもよい。実装が ディレクトリを全体ではなく部分的に削除するということは認められていな い。実装は、かならずしも、すべての場合でディレクトリの消去ができなけ ればならない訳ではない(たとえば、ルートディレクトリの削除)。

removeFile file 計算は既存のファイル file のディ レクトリエントリを削除する。ここで、file はディレクトリではな い。実装はファイルを削除する前に満すべき付加的制限を指定してもよい (たとえば、当該のファイルは他のプロセスで使用されていないこと) 。

エラーについて: removeDirectory および removeFile 計算はユーザが当該のディレクトリやファイルを削除 する権限を持たなければ isPermissionError で失敗する。また、 ディレクトリやファイルが存在しなければ、 isDoesNot-ExistError で失敗する。

renameDirectory old new 計算は既存のディレクト リの名前を old から new へ変更する。もし、new ディ レクトリがすでに存在していれば、そのディレクトリは自動的に old ディレクトリに置きかわる。もし、 newold ディレクト リではなく、かつ、old ディレクトリの別名でもなければ、これは、 removeDirectory を使ったときと同様に削除される。ディレクトリ の名前の変更はかならずしもすべての状況でサポートされている必要はない。 (たとえば、異る物理デバイスをまたいだ既存のディレクトリの名前の変更)。 しかし、その制約についてはドキュメント化されていなければならない。

renameFile old new 計算は既存のファイルシステ ムオブジェクトの名前を old から new へ変更する。もし new オブジェクトが既に存在する場合、それは自動的に old オブジェクトに置きかわる。いずれのパスも既存のディレクトリを参照する ことはない。実装はすべての状況でファイルの名前の変更を実装しなければ ならないわけではない。(たとえば、異る物理デバイスをまたいだ名前の変更)。 しかし、その制約についてはドキュメント化されていなければならない。

エラーについて: renameDirectory および renameFile 計算は、ユーザが 当該のファイルあるいディレクトリの名前を変更する権限をもたない場合あ るいは、renameFile への引数がディレクトリであった場合には isPermissionError で失敗する。また、当該のファイルあるいはディ レクトリが存在しない場合には、isDoesNotExistError で失敗する。

getDirectoryContents dir 計算は dir 内の全てのエ ントリのリストを返す。返されたリストの各エントリは、そのディレクトリ dir からの相対で名前がつく、絶対パスではない。

もし、オペレーティングシステムがカレントディレクトリの概念をもつなら、 getCurrentDirectory は呼び出したプロセスのカレントディレクト リの絶対パスを返す。

エラーについて: getDirectoryContents および getCurrentDirectory 計 算は、ユーザに当該ディレクトリへのアクセス権限がなければ、 isPermissionError で失敗する。また、当該ディレクトリが存在し なければ、isDoesNotExistError で失敗する。

もし、オペレーティングシステムがカレントディレクトリの概念をもつなら、 setCurrentDirectory dir は呼び出しプロセスのカレント ディレクトリを dir に変更する。

エラーについて: setCurrentDirectory 計算は、ユーザが指定したディレクトリへ変 更する権限を持たなければ、isPermissionError で失敗 する。 もし、当該ディレクトリが存在しなければ、 isDoesNotExistError で失敗する。

Permissions 型はファイルあるいはディレクトリに対する特定の操 作を許可するかどうかを記録するために使用される。 getPermissions および setPermissions は許可属性を取 得あるいは設定する。許可属性はファイルとディレクトリの両方に適用され る。ディレクトリに対しては、executable フィールドは False であり、ファイルに対しては、searchable フィー ルドは False である。ディレクトリはパス部分に許可属性があれ ば読み取り可能でなくとも検索可能である。しかし、この場合はディレクト リの内容を確かめることはできない。

パーミッションのいくつか(すべてではない)を変更には以下のような使い方 をしなければならない。

makeReadable f = do
    p <- getPermissions f
    setPermissions f (p {readable = True})

doesDirectoryExist 操作は、引数のファイルが存在しかつそれが ディレクトリである場合に True を返し、それ以外の場合には False を返す。doesFileExist 操作は、引数のファイル が存在しそれがディレクトリでなければ True を替えし、そうでな ければ、False を返す。

getModificationTime 操作はファイルあるいはディレクトリが最後 に変更された時刻を返す。

エラーについて: get(set)PermissionsdoesFile(Directory)Exist、 およびgetModificationTime 計算は、ユーザが当該の情報 にアクセスづる権利を持たない場合には isPermissionError で失 敗する。また、当該ファイルおよびディレクトリが存在しない場合には isDoesNotExistError で失敗する。 setPermissions 計 算も、ユーザが当該のファイルあるいはディレクトリのパーミッションを変 更する権限を持たない場合には、isPermissionError で失敗し、当 該ファイルあるいはディレクトリが存在しない場合には isDoesNotExistError で失敗する。


The Haskell 98 Report
top | back | next | contents | function index
December 2002