Файловый способ хранения данных – это способ хранения данных, при котором каждый набор данных представляется как именованное, защищенное собрание записей, называемое файлом.
Файл – идентифицированная совокупность экземпляров типов данных, расположенных во внешней памяти и доступных программе посредством специальных операций.
Файловая система – система управления данными с файловым способом хранения. В результате применения файловой подсистемы пользователь получает виртуальное представление внешней памяти и работает с ней не как с конкретным физическим устройством, а в терминах, обусловленных особенностями структуры и составом его конкретных данных. Файловая система и среда хранения обеспечивает возможность хранения файлов без ограничения объемов. Позволяет организовать доступ, как к его отдельным файлам, так и их составным частям с учетом логической структуры.
Файловая система должна включать следующие элементы:
1) средства взаимодействия с процессами пользователей, обеспечивающие прием и интерпретацию запретов от пользователя на обработку файлов и сообщение результатов;
|
|
2) средства реализации методов доступа к файлам и к его составным элементам;
3) средства распределения внешней памяти для хранения файлов, а также ее освобождение после удаления;
4) средства учета расположения файлов и их составных элементов. Данные средства составляют логический уровень управления доступом. Физический уровень – подсистема ввода-вывода.
23 Создание файла (Win32 API)
Функция CreateFile может создавать и открывать не только дисковые файлы, но и множество других устройств.
HANDLE CreateFile (LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
Параметр dwDesiredAccess определяет способ передачи данных и принимает одно из четырех значений: 0, GENERIC_READ, GENERIC_WRITE, GENERIC_READ | GENERIC_WRITE.
Параметр dwShareMode определяет режим совместного использования устройства (0, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE)
Параметр lpSecurityAttributes указывает на структуру SECURITY_ATTRIBUTES, которая позволяет задать атрибуты защит для связанного с устройством объекта ядра и определить, будет ли возращенный описатель наследуемым (т.е. получит ли дочерний процесс доступ к устройству).
Параметр dwCreationDisposition важен, когда CreateFile вызывается для открытия именно файла, а не устройства какого-то другого типа (CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS, TRUNCATE_EXISTING). Если открывается устройство, отличное от файла, то в параметр передается OPEN_EXISTING.
Параметр dwFlagsAndAttributes служит двум целям: позволяет задавать флаги, тонко настраивающие взаимодействие с устройством, а если устройство является файлом, то и устанавливать атрибуты. Флаги: FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_DELETE_ON_CLOSE, FILE_FLAG_NO_BUFFERING, FILE_FLAG_OPEN_NO_RECALL, FILE_FLAG_OPEN_REPARSE_POINT, FILE_FLAG_OVERLAPPED, FILE_FLAG_POSIX_SEMANTICS, FILE_FLAG_RANDOM_ACCESS, FILE_FLAG_SEQUENTIAL_SCAN, FILE_FLAG_WRITE_THROUGH. Атрибуты: FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_OFFLINE, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_TEMPORARY.
|
|
Параметр hTemplateFile содержит или описатель открытого файла, или NULL. Если в hTemplateFile указан описатель файла, то CreateFile игнорирует флаги атрибутов в параметре dwFlagsAndAttributes и использует атрибуты того файла, на который указывает hTemplateFile (должен быть установлен флаг GENERIC_READ). Если CreateFile не создает новый файл, а открывает существующий, параметр игнорируется.
24 Операции с файлом (Win32 API)
1) Позиционирование файлового указателя
Когда CreateFile возвращает описатель файла, система связывает с этим описателем файловый указатель. Он определяет 64-разрядное смещение внутри файла, начиная с которого будет выполняться очередная операция синхронного чтения или записи. Сначала файловый указатель устанавливается в 0, и, если вызвать ReadFile или WriteFile, то указатель сместиться на количество прочитанных / записанных байтов.
Для произвольного доступа к файлу используется функция
DWORD SetFilePointer (HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
Параметр hFile идентифицирует описатель файла, с которым связан указатель.
Параметр lDistanceToMove сообщает системе, на сколько байтов Вы хотите сместить указатель. Передаваемое число добавляется к текущему значению указателя, поэтому отрицательное число позволяет перемещаться назад.
Параметр lpDistanceToMoveHigh используется для перемещения указателя в больших файлах, для которых не хватает 32-битного смещения.
Параметр dwMoveMethod сообщает функции SetFilePointer, как интерпретировать параметры lDistanceToMove и lpDistanceToMoveHigh (FILE_BEGIN, FILE_CURRENT, FILE_END).
2) Установка конца файла
Обычно система сама устанавливает конец файла при его закрытии. Но иногда нужно принудительно укоротить или расширить файл. Для этого используется функция
BOOL SetEndOfFile (HANDLE hFile);
Она изменяет длину файла по текущему значению файлового указателя.
3) Блокировка и разблокировка участков файла
Блокировка участка файла осуществляется вызовом функции:
BOOL LockFile (HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
Параметр hFile идентифицирует описатель файла, участок которого нужно блокировать.
Параметры dwFileOffsetLow и dwFileOffsetHigh определяют 64-битное смещение начала блокируемого участка внутри файла, а параметры nNumberOfBytesToLockLow и nNumberOfBytesToLockHigh – число блокируемых байтов.
Для разблокирования участка файла используется функция:
BOOL UnlockFile (HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh);
Ее параметры аналогичны предыдущей функции.
4) Чтение запись
Для чтения используется функция:
BOOL ReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
Для записи используется функция:
BOOL WriteFile (HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
Хотя в именах функций есть слово File, эти функции можно использовать для работы с любым устройством.
Параметр hFile – описатель устройства, к которому необходимо получить доступ.
Параметр lpBuffer указывает на буфер, в который считываются данные с устройства (или из которого записываются данные на устройство).
Параметры nNumberOfBytesToRead и nNumberOfBytesToWrite сообщают функциям ReadFile и WriteFile, сколько байтов следует прочесть с устройства или записать на него.
Параметр lpOverlapped используется для асинхронного ввода/вывода.