Файлы (общие сведения)

Файловый способ хранения данных – это способ хранения данных, при котором каждый набор данных представляется как именованное, защищенное собрание записей, называемое файлом.

Файл – идентифицированная совокупность экземпляров типов данных, расположенных во внешней памяти и доступных программе посредством специальных операций.

Файловая система – система управления данными с файловым способом хранения. В результате применения файловой подсистемы пользователь получает виртуальное представление внешней памяти и работает с ней не как с конкретным физическим устройством, а в терминах, обусловленных особенностями структуры и составом его конкретных данных. Файловая система и среда хранения обеспечивает возможность хранения файлов без ограничения объемов. Позволяет организовать доступ, как к его отдельным файлам, так и их составным частям с учетом логической структуры.

Файловая система должна включать следующие элементы:

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 используется для асинхронного ввода/вывода.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: