Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 10.pptx
Скачиваний:
60
Добавлен:
18.02.2023
Размер:
174.74 Кб
Скачать

HANDLE CreateFile (

 

LPCTSTR lpFileName,

// имя файла

DWORD dwDesiredAccess,

// режим доступа

DWORD dwShareMode,

// совместный доступ

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD (дескр. защиты)

DWORD dwCreationDisposition,

// как действовать

DWORD dwFlagsAndAttributes,

// атрибуты файла

HANDLE hTemplateFile

// дескр.шаблона файла

);

 

Параметры:

lpFileName - Указатель на символьную строку с нулем в конце, устанавливающую имя объекта, который создается или открываться.

dwDesiredAccess - Тип доступа к объекту (чтение, запись или то и другое). Приложение может получить доступ для чтения, записи, чтения и записи или для запроса устройства. Допустимые значения параметра:

0 – Разрешить приложению запрашивать атрибуты устройства без фактического доступа к устройству.

GENERIC_READ – Определить доступ для чтения. Приложение может читать данные из файла и перемещать указатель файла.

GENERIC_WRITE - Определить доступ для записи. Приложение может писать данные в файл и перемещать указатель файла.

Для получения доступа для чтения и записи необходимо установить

GENERIC_READ и GENERIC_WRITE.

dwShareMode – Определяет способ совместного доступа к объекту. Допустимые значения параметра:

0 – Запретить совместное использование файла.FILE_SHARE_READ – Файл может открываться для чтения.FILE_SHARE_WRITE - Файл может открываться для записи.

lpSecurityAttributes – Указатель на структуру SUCURITY_ATTRIBUTES, которая указывает атрибуты защиты каталога. Файловая система длжна обеспечивать поддержку защиты на уровне файловой системы NTFS; в ином случае этот параметр не имеет силы.

dwCreationDisposition – определяет действие, которое необходимо выполнить в том случае, если файл существует, и в том случае, если нет. Допустимые значения параметра:

CREATE_ALWAYS – Создать новый файл. Функция перезаписывает файл, если он существует.

CREATE_NEW - Создать новый файл. Функция не срабатывает, если указанный файл уже существует.

OPEN_ALWAYS – Олткрыть файл, если он существует. Если файл не существует, функция создает файл, как если бы параметр имел значение

CREATE_NEW .

OPEN_EXISTING – Открыть файл. Функция не срабатывает, если файл не существует.

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

dwFlagsAndAttributes - Атрибуты и флажки файла. Когда CreateFile открывает существующий файл, он объединяет флажки файла с существующими его атрибутами, но игнорирует любые предоставляемые атрибуты файла. Этот параметр может включать в себя любую комбинацию атрибутов файла. По умолчанию параметр имеет значение FILE_ATTRIBUTE_NORMAL.

hTemplateFile - Дескриптор файла шаблона с правом доступа GENERIC_READ. Файл шаблона предоставляет атрибуты файла и дополнительные атрибуты для создающегося файла. Этот параметр должен быть равен NULL. При открытии существующего файла, CreateFile игнорирует файл шаблона.

Пример: Открытие файла для чтения

HANDLE hFile = CreateFile(

 

 

EXT("myfile.txt"),

// открываемый файл

GENERIC_READ,

 

// открываем для чтения

FILE_SHARE_READ,

// для совместного чтения

NULL,

// защита по умолчанию

OPEN_EXISTING,

 

// только существующий файл

FILE_ATTRIBUTE_NORMAL, // обычный файл

NULL);

// атрибутов шаблона нет

CreateFile завершается успешно только в том случае, если файл по имени myfile.txt уже существует в текущем каталоге. Последующий вызов

CreateFile для этого файла завершится успешно, если вызов использует тот

Пример: Открытие файла для записи

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

#include <windows.h> #include <stdio.h>

HANDLE hFile = CreateFile(

 

TEXT("myfile.txt"),

// создаваемый файл

GENERIC_WRITE,

// открывается для записи

0,

// совместно не используется

NULL,

// защита по умолчанию

CREATE_ALWAYS,

// переписывает существующий

FILE_ATTRIBUTE_NORMAL | // обычный файл

FILE_FLAG_OVERLAPPED, // асинхронный ввод/вывод I/O

NULL); // атрибутов шаблона нет

if (hFile == INVALID_HANDLE_VALUE)

{

printf("Could not open file (error %d)\n", GetLastError()); return 0;

}

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

Чтение и запись в файлы

Приложение читает из и пишет в файл, используя функции ReadFile, ReadFileEx и WriteFileEx. Эти функции требуют дескриптора файла, открытого для чтения и записи, соответственно. Они читают и записывают указанное число байтов в месте, обозначенном указателем позиции в файле. Данные читаются и записываются именно так, как определены; функции не форматируют данные.

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

Функция ReadFile читает данные из файла, начиная с позиции, обозначенной указателем файла. После того, как операция чтения была закончена, указатель файла перемещается на число действительно прочитанных байтов, если дескриптор файла не создан с атрибутом асинхронной операции. Если дескриптор файла создается для асинхронного ввода - вывода, приложение должно переместить позицию указателя файла после операции чтения.

Эта функция предназначена и для синхронной и асинхронной операции. Функция ReadFileEx предназначена исключительно для асинхронной операции. Это дает возможность приложению выполнять другие действия в ходе операции чтения файла.

Синтаксис

BOOL ReadFile(

 

 

HANDLE hFile,

// дескриптор файла

LPVOID lpBuffer,

// буфер данных

DWORD nNumberOfBytesToRead,

// число байтов для чтения

LPDWORD lpNumberOfBytesRead,

// число прочитанных байтов

LPOVERLAPPED lpOverlapped

// асинхронный буфер

);

 

 

Функция ReadFileEx читает данные из файла асинхронно. Она предназначена исключительно для асинхронных операций, в отличие от функции ReadFile, которая предназначена и для синхронных, и для асинхронных операций. ReadFileEx позволяет приложению в ходе операции чтения файла исполнять другую работу.

Функция ReadFileEx сообщает о своем состоянии завершения работы асинхронно, вызывая заданную процедуру завершения тогда, когда чтение заканчивается или отменяется, а вызывающий поток находится в готовом к действию режиме ожидания.

Синтаксис

BOOL ReadFileEx(

 

 

HANDLE hFile,

// дескриптор файла

LPVOID lpBuffer,

// буфер данных

DWORD nNumberOfBytesToRead,

// число читаемых байтов

LPOVERLAPPED lpOverlapped,

// смещение

LPOVERLAPPED_COMPLETION_ROUTINE

lpCompletionRoutine

// процедура завершения

);

 

 

Функция WriteFile пишет данные в файл с места, обозначенного указателем позиции в файле. Эта функция предназначена и для синхронной, и для асинхронной операции.

Функция WriteFileEx предназначена исключительно для асинхронной операции.

Синтаксис

BOOL WriteFile(

 

HANDLE hFile,

// дескриптор файла

LPCVOID lpBuffer,

// буфер данных

DWORD nNumberOfBytesToWrite, // число байтов для записи LPDWORD lpNumberOfBytesWritten, // число записанных байтов

LPOVERLAPPED lpOverlapped

// асинхронный буфер

);

 

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

Чтобы записать данные в файл синхронно, используйте функцию WriteFile.

Синтаксис

 

 

BOOL WriteFileEx(

 

 

HANDLE hFile,

// дескриптор файла вывода

LPCVOID lpBuffer,

// буфер данных

DWORD nNumberOfBytesToWrite,

// число байтов для записи

LPOVERLAPPED lpOverlapped,

// асинхронный буфер

LPOVERLAPPED_COMPLETION_ROUTINE

lpCompletionRoutine

// процедура завершения

);

 

 

Перемещение и замена файлов

Прежде, чем файл может быть скопирован, он должен быть закрыт или открыт только для чтения. Поток не может скопировать файл, открытый для записи. Чтобы скопировать существующий файл в новый, используйте функцию CopyFile или CopyFileEx. Приложения могут определить, завершаются ли CopyFile и CopyFileEx ошибкой, если получившийся файл уже существует.

Функция ReplaceFile заменяет один файл другим файлом, с параметром создания резервной копии исходного файла. Функция сохраняет атрибуты исходного файла, такие как его время создания, списки контроля доступа (ACL) и атрибут шифрования.

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

Функция MoveFileEx также дает возможность приложению определять, как переместить файл. Функция может заменить существующий файл, перемещать файл между томами и задерживать перемещение файла до тех пор, пока операционная система не перезапустится.

Соседние файлы в папке Лекции