Опубликован: 19.09.2008 | Доступ: свободный | Студентов: 656 / 70 | Оценка: 4.50 / 5.00 | Длительность: 21:25:00
Лекция 23:

Функции с каталогами

< Лекция 22 || Лекция 23 || Лекция 24 >
Аннотация: В этой лекции вы узнаете о функциях, которые работают с каталогами в файловой системе

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 может вызвать isIllegalOperation, как описано в разделе "21.1" ; все другие допустимые ошибки описаны ниже. Обратите внимание, в частности, на то, что если реализация не поддерживает операцию, она должно вызвать isIllegalOperation. Каталог содержит ряд записей, каждая из которых является именованной ссылкой на объект файловой системы (файл, каталог и т.д.). Некоторые записи могут быть скрыты, недоступны или иметь некоторую административную функцию (например, "." или ".." в POSIX), но считается, что все такие записи формируют часть содержимого каталога. Записи в подкаталогах, однако, не считаются частями содержимого каталога. Тем не менее могут быть объекты файловой системы, отличные от файлов и каталогов, эта библиотека не различает физические файлы и другие объекты, не являющиеся каталогами. Все такие объекты поэтому должны обрабатываться как если бы они были файлами.

На каждый объект файловой системы ссылается путь. Обычно есть по крайней мере один абсолютный путь к каждому объекту файловой системы. В некоторых операционных системах возможно также иметь пути, которые относятся к текущему каталогу.

Функция createDirectory dir создает новый каталог dir, который первоначально пуст, или настолько пуст, насколько позволяет операционная система.

Сообщения об ошибках. Функция createDirectory может завершиться с ошибкой isPermissionError, если пользователь не имеет прав на создание каталога; isAlreadyExistsError, если каталог уже существует; isDoesNotExistError, если родительский каталог для нового каталога не существует.

Функция removeDirectory dir удаляет существующий каталог dir. Реализация может установить дополнительные ограничения, которые должны быть выполнены до того, как каталог будет удален (например, каталог должен быть пуст или не может использоваться другими процессами). Реализация не должна частично удалять каталог, если весь каталог не удален. Соответствующая реализация не обязана поддерживать удаление каталогов во всех ситуациях (например, удаление корневого каталога).

Функция removeFile file удаляет запись в каталоге для существующего файла file, где file сам не является каталогом. Реализация может установить дополнительные ограничения, которые должны быть выполнены до того, как файл будет удален (например, файл не может использоваться другими процессами).

Сообщения об ошибках. Функции removeDirectory и removeFile могут завершиться с ошибкой isPermissionError, если пользователь не имеет прав на удаление файла/каталога; isDoesNotExistError, если файл/каталог не существует.

Функция renameDirectory old new изменяет имя существующего каталога old на new. Если каталог new уже существует, он атомарно замещается каталогом old. Если каталог new не является ни каталогом old, ни псевдонимом каталогом old, он удаляется как с помощью removeDirectory. Соответствующая реализация не обязана поддерживать переименование каталогов во всех ситуациях (например, переименование существующего каталога или переименование между различными физическими устройствами), но ограничения должны быть задокументированы

Функция renameFile old new изменяет имя существующего объекта файловой системы old на new. Если объект new уже существует, он атомарно замещается объектом old. Также путь не может ссылаться на существующий каталог. Соответствующая реализация не обязана поддерживать переименование файлов во всех ситуациях (например, переименовывание между различными физическими устройствами), но ограничения должны быть задокументированы.

Сообщения об ошибках. Функции renameDirectory и renameFile могут завершиться с ошибкой isPermissionError, если пользователь не имеет прав на переименование файла/каталога или если один из двух аргументов renameFile является каталогом; 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)Permissions, doesFile(Directory)Exist и getModificationTime могут завершиться с ошибкой isPermissionError, если пользователь не имеет прав на доступ к соответствующей информации; isDoesNotExistError, если файл/каталог не существует. Функция setPermissions может также завершиться с ошибкой isPermissionError, если пользователь не имеет прав на изменение прав для указанного файла или каталога; isDoesNotExistError, если файл/каталог не существует.

< Лекция 22 || Лекция 23 || Лекция 24 >
Николай Щербаков
Николай Щербаков
Россия, Москва
Олег Корсак
Олег Корсак
Латвия, Рига