Изучение функций (средств) Win32 API для работы с файлами и каталогами: Методические рекомендации по выполнению лабораторной работы, страница 2

Основной функцией здесь является  CreateFile().  Несмотря на имя, эта функция может не только создать новый файл, но и открыть существующий. Для этого функция создает дескриптор (handle) файла, который используется в дальнейшем при работе с файлом (сопоставьте с MS-DOS!).  Если файл с указанным именем уже существует, то вызов CreateFile() может либо открыть его, либо уничтожить его и создать новый файл с таким же именем.  Синтаксис функции: 

HANDLE CreateFile( LPCTSTR lpFileName,    DWORD dwDesiredAccess,   DWORD dwShareMode,   LPSECURITY_ATTRIBUTES lpSecurityAttributes,   DWORD dwCreationDistribution,        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 устанавливает, будет ли создаваемый дескриптор файла наследоваться дочерними процессами. Если этот аргумент имеет значение NULL, то дескриптор не будет наследоваться. Более подробно этот параметр здесь не рассматривается.

Параметр dwCreationDistribution указывает, как следует создать или открыть файл. Значение CREATE_NEW означает, что создается новый файл, если файл уже существует, то функция не срабатывает. Значение CREATE_ALWAYS устанавливает создание нового файла, если файл существует, то он перезаписывается. Значение OPEN_EXISTING определяет создание нового файла, OPEN_ALWAYS –открытие файла, при этом, если файл не существует, то он создается. Значение параметра TRUNCATE_EXISTING  предопределяет создание файла и усечение его длины до нуля, если файл не существует, то функция не выполняется.

Следующий параметр dwFlagsAndAttributes определяет набор атрибутов и флагов, которыми должен обладать файл. Флаги могут комбинироваться. В таблице 1 приведены значения флагов.

Последний аргумент hTemplateFile CreateFile означает, что будет использоваться дескриптор шаблонного файла, атрибуты которого будут присвоены создаваемому файлу. При этом файл должен открываться с доступом GENERIC_READ.

Функция CreateFile при нормальном завершении возвращает NULL, в случае ошибки возвращает значение INVALID_HANDLE_VALUE, которое равно константе  0xffffffff.

· Закрытие файла осуществляется с помощью функции BOOL CloseHandle(HANDLE hObject), которой передается единственный аргумент – дескриптор файла  hObject.

                                                                                                                                    Таблица 1

Флаг или атрибут

Содержание

FILE_ATTRIBUTE_READONLY

FILE_ATTRIBUTE_HIDDEN

FILE_ATTRIBUTE_SYSTEM

FILE_ATTRIBUTE_ARCHIVE

FILE_ATTRIBUTE_TEMPORARY

FILE_FLAG_POSIX_SEMANTICS

FILE_FLAG_BACKUP_SEMANTICS

FILE_FLAG_DELETE_ON_CLOSE

FILE_FLAG_SEQUENTIAL_SCAN

FILE_FLAG_RANDOM_ACCES

FILE_FLAG_NO_BUFFERING

FILE_FLAG_OVERLAPPED

FILE_FLAG_WRITE_THROUCH

Файл только для чтения

Скрытый файл

Системный файл, является частью операционной системы.

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

Создается временный файл, система сохраняет его в памяти

Доступ к файлу осуществляется в соответствии с правилами POSIX. Разрешается использовать несколько разных файлов, имена которых отличаются только регистром символов.

Файл предназначен для операций резервного копирования или восстановления из резервных файлов.

Используется для временных файлов, файл после закрытия удаляется.

Доступ к файлу осуществляется последовательно от начала к концу. Используется для оптимизации режима кэширования файла.

Доступ к файлу осуществляется случайным образом. Соответственно оптимизируется режим кэширования файла.

Файл открывается без использования кэширования или буферизации.

Устанавливает асинхронный доступ к файлу (в Windows 95/98 не реализован)

Приказывает Windows выполнять немедленную запись данных на диск. Отключается промежуточное кэширование.

· Функция SetFilePointer перемещает (позиционирует) указатель файла, последний с помощью внутренней системной переменной указывает на позицию файла, с которой будут выполняться операции ввода / вывода. Синтаксис этой функции:

DWORD SetFilePointer(HANDLE  hFile, LONG  lDistanceToMove, PLONG
lpDistanceToMoveHighDWORD dwMoveMethod);.

Параметр hFile  - это хэндл файла, параметр lDistanceToMove определяет значения перемещения. Если аргумент положительный, то указатель перемещается вперед, если – отрицательный, то к началу файла. Третий параметр lpDistanceToMoveHigh представляет собой указатель на буфер, содержащий старшие 32 разряда требуемого значения перемещения, при этом новое значение указателя файла определяется выражением

Новое значение = Старое значение + lDistanceToMove +(* lpDistanceToMoveHigh).

Последний параметр dwMoveMethod устанавливает положение, относительно которого производится перемещение указателя. При значении FILE_BEGIN отсчет производится относительно начала файла. Значение FILE_CURRENT определяет в качестве точки отсчета текущее положение указателя, значение FILE_END – конец файла. 

При нормальном выполнении функция возвращает в двойном слове новое значение указателя файла, приэтом для больших значений старшие 32 разряда передаются по адресу lpDistanceToMoveHigh.

·  Функция ReadFile выполняет чтение данных из файла. Её синтаксис имеет вид

BOOL ReadFile(HANDLE hFile, LPVOID lpBufferDWORD nNumberOfBytesToRead,     LPDWORD    lpNumberOfBytesReadLPOVERLAPPED  lpOverlapped);.

Первый параметр hFile этой функции очевиден. Второй параметр lpBuffer определяет указатель на буфер, в который будет производиться чтение данных.  Третий параметр nNumberOfBytesToRead  устанавливает число байтов для операции чтения. Число реально прочитанных байтов записывается в буфер, на который указывает lpNumberOfBytesRead. Наконец, последний параметр lpOverlapped  - это указатель на структуру типа OVERLAPPED, которая используется при асинхронном вводе-выводе. При синхронном вводе-выводе, используемом в данной лабораторной работе, этот аргумент устанавливается, как NULL.