Функция CreateFile может создать новый или открыть существующий файл. Вы должны определить имя файла, инструкции создания и другие атрибуты. Когда приложение создает новый файл, операционная система добавляет его в заданный каталог.
Когда приложение использует функцию CreateFile, то должно использовать параметр dwDesiredAccess, чтобы определить, будет ли оно читать из файла, записывать в файл, или делать то и другое вместе. Это известно нам как режим доступа (access mode). Приложение должно также установить и какое выбрать действие, если файл уже существует. Например, прикладная программа может вызвать функцию CreateFile с флажком CREATE_ALWAYS, которая создает файл, если он не существует и переписывает файл, если он существует.
Приложение также может использовать функцию CreateFile, чтобы определить, допускает ли оно совместно использовать файл для чтения, записи, то и другое вместе, или не допускает ни того, ни другого действия. Это известно нам как режим совместного использования (sharing mode). Открытый файл, который не используется совместно, не может открыться снова и приложением, которое открыло его, и другим приложением до тех пор, пока его дескриптор не будет закрыт.
Когда процесс пытается открыть файл, который уже был открыт в режиме совместного доступа, система сравнивает затребованный доступ и режимы совместного доступа, который был определен, когда файл открывался. Если Вы установили режим доступа, который находится в противоречии с режимом совместного доступа, определенным при предыдущем открытии, вызов CreateFile завершается ошибкой совместного доступа (ERROR_SHARING_VIOLATION). Если Вы определяете использование режима совместного доступа, который находится в противоречии с режимом доступа, определенным при предыдущем открытии, вызов CreateFile завершается ошибкой совместного доступа.
Таблица ниже иллюстрирует допустимые комбинации режимов доступа и режимов совместного использования.
Обратите внимание! на то, что в строке заголовка таблицы используются сокращения, чтобы уменьшить ее ширину. Строка заголовка должна читаться точно также как и первый заголовок в столбце. |
G_R FS_R |
G_R FS_W |
G_R FS_R FS_W |
G_W FS_R |
G_W FS_W |
G_W FS_R FS_W |
G_R G_W FS_R |
G_R G_W FS_W |
G_R G_W FS_R FS_W |
|
---|---|---|---|---|---|---|---|---|---|
GENERIC_READ FILE_SHARE_READ |
Y | Y | |||||||
GENERIC_READ FILE_SHARE_WRITE |
Y | Y | |||||||
GENERIC_READ FILE_SHARE_READ FILE_SHARE_WRITE |
Y |
Y |
Y |
Y |
Y |
Y |
|||
GENERIC_WRITE FILE_SHARE_READ |
Y | Y | |||||||
GENERIC_WRITE FILE_SHARE_WRITE |
Y | Y | |||||||
GENERIC_WRITE FILE_SHARE_READ FILE_SHARE_WRITE |
Y |
Y |
Y |
Y |
Y |
Y |
|||
GENERIC_READ GENERIC_WRITE FILE_SHARE_READ |
Y |
||||||||
GENERIC_READ GENERIC_WRITE FILE_SHARE_WRITE |
Y |
||||||||
GENERIC_READ GENERIC_WRITE FILE_SHARE_READ FILE_SHARE_WRITE |
Y |
Y |
В дополнение к стандартным атрибутам файла, Вы можете также задать и атрибуты защиты, включив указатель на структуру SECURITY_ATTRIBUTES, как четвертый параметр. Однако, лежащая в основе файловая система должна поддерживать эту систему безопасности для этих атрибутов, чтобы они оказывали хоть какое-то влияние. Дополнительную информацию об атрибутах защиты смотри в статье Управление доступом.
Приложение, создающее новый файл, может предоставить шаблонный файл, из которого CreateFile берет атрибуты файла и дополнительные атрибуты для нового файла.
При создании нового файла, функция CreateFile выполняет ниже перечисленные действия:
При открытии существующего файла, CreateFile выполняет ниже перечисленные действия:
Операционная система назначает уникальный идентификатор, называемый дескриптором файла (file handle), каждому файлу, который открывается или создается. Приложение может использовать дескриптор файла в функциях, которые читают из, записывают в и характеризуют файл. Он допустим до тех пор, пока файл не закроется. Когда приложение запускается, оно наследует все открытые дескрипторы файла из процесса, который запустил его, если дескрипторы наследуются.
Прикладная программа должна проверить возвращаемое значение функции CreateFile перед попыткой использовать этот дескриптор, чтобы получить доступ к файлу. Если происходит ошибка, приложение может использовать функцию GetLastError, чтобы получить дополнительную информацию об ошибке.
Фрагмент нижеследующего кода использует CreateFile, чтобы открыть существующий файл для чтения.
#include <windows.h> #include <stdio.h> HANDLE hFile; hFile = CreateFile(TEXT("myfile.txt"), // открываемый файл GENERIC_READ, // открываем для чтения FILE_SHARE_READ, // для совместного чтения NULL, // защита по умолчанию OPEN_EXISTING, // только существующий файл FILE_ATTRIBUTE_NORMAL, // обычный файл NULL); // атрибутов шаблона нет if (hFile == INVALID_HANDLE_VALUE) { printf("Could not open file (error %d)\n", GetLastError()); return 0; } |
В этом случае, CreateFile завершается успешно только в том случае, если файл по имени Myfile.txt уже существует в текущем каталоге. Последующий вызов CreateFile открыть этот файл завершится успешно, если вызов использует тот же самый доступ и режимы совместного использования.
Фрагмент нижеследующего кода использует CreateFile, чтобы создать новый файл и открывает его для записи.
#include <windows.h> #include <stdio.h> HANDLE hFile; 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, чтобы открыть этот файл, завершится ошибкой, пока дескриптор не закроется.