22. Win32 api. Создание файла
Файл может быть создан с помощью функции CreateFile, кот. возвращает описатель созданного файла.
HANDLE CreateFile (LPCTSTR IpFileName, // путь и имя файла
DWORD dwDesiredAccess, // определяет, как будет производиться обмен данными с устройством
DWORD dwShareMode, // определяет привилегии при совместном использовании устройства
LPSECURITY_ATTRIBUTES IpSecurityAttributes, // указывает на структуру SECURITY_ATTRIBUTES, позв. задать инфу о защите и определить, будет ли наследуемым описатель, возвращаемый CreateFile
DWORD dwCreationDisposition, //способ открытия файла
DWORD dwFlagsAndAttributes, // позволяет установить флаги для оптимизации взаимодействия с уст-м
HANDLE hTemplateFile // передает описатель уже открытого файла или им.знач. NULL);
Параметр dwDesiredAccess определяет, как будет производиться обмен данными с устройством. Этому параметру можно присвоить одно из 4-х значений: 0 – считывание и запись данных на устройство производиться не будут; GENERIC_READ – разрешает доступ к устройству только для чтения; GENERIC_WRITE – разрешает доступ к устройству только для записи; GENERIC_READ| GENERIC_WRITE - разрешает доступ для чтения и записи.
Параметр dwShareMode определяет привилегии при совместном использовании устройства, когда к нему возможен одновременный доступ нескольких сетевых компьютеров или нескольких процессов. Этому параметру можно присвоить одно из следующих значений: 0 – другие процессы не смогут считывать или записывать данные на устройство; FILE_SHARE_READ – другие процессы не смогут записывать данные на устройство; FILE_SHARE_WRITE – другие процессы не смогут считывать данные с устройства; FILE_SHARE_READ| FILE_SHARE_WRITE - другие процессы смогут считывать или записывать данные на устройство, если оно свободно.
Параметр IpSecurityAttributes указывает на структуру SECURITY_ATTRIBUTES, позволяющую задать инфу о защите и определить, будет ли наследуемым описатель, возвращаемый CreateFile. Дескриптор защиты, содержащийся в этой структуре, применяется только при создании файла в защ-ой файловой системе NTFS, в остальных случаях он игнор-ся. Передаваемое значение NULL указывает, что файл создается с атрибутами защиты по умолч. и возвращаемый описатель не может быть унаследован.
Параметр dwCreationDisposition обычно используется при открытии файлов, а не устройств других типов. Он может принимать следующие значения: CREATE_NEW – функция CreateFile должна создать новый файл. Если файл с указанным именем уже существует, то функция не выполняется. CREATE_ALWAYS - функция CreateFile должна создать новый файл. Если файл с указанным именем уже существует, то CreateFile его обнуляет. OPEN_EXISTING - функция CreateFile должна открыть существующий файл или другое устройство. Если файла с указанным именем нет, то функция не выполняется. OPEN_ALWAYS - функция CreateFile должна открыть файл, если он существует, или создать новый, если его нет. TRUNCATE_EXISTING - функция CreateFile должна открыть существующий файл и обнулить его размер. Если файл не существует, то функция не выполняется. При открытии с помощью CreateFile устройства, отличного от файла, значение параметра dwCreationDisposition должно быть OPEN_EXISTING.
Параметр dwFlagsAndAttributes исп-ся для двух целей: он позволяет установить флаги для оптимизации взаимодействия с уст-ом, а также, если устройство является файлом, - установить его атрибуты. Например, флаг FILE_FLAG_NO_BUFFERING указывает, что доступ к файлу должен производиться без буферизации данных. Установка этого флага иногда способна повысить скорость и оптимизировать использ-ие памяти приложением. Флаг FILE_FLAG_OVERLAPPED задает асинх-ый обмен данными с устройством. По умолчанию устройства открываются для синхронного ввода-вывода и данный флаг не устанавливается. При этом поток приостанавливает работу на время чтения данных из файла, ожидая, когда будет считана вся информация. Флаги: 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 не создает новый файл, а открывает существующий, параметр игнорируется.
23. Win32 API. Операции с файлом
1. Открытие
Выполняется с помощью функции CreateFile(), где в 5-ом параметре dwCreationDisposition указывают либо OPEN_EXISTING — открыть существующий файл (если его нет, то не выполняется функция), либо OPEN_ALWAYS — открыть файл, если он существует (если нет, то создается).
2. Закрытие
BOOL CloseHandle( HANDLE hObject //описатель объекта(файла) );
3. Запись
BOOL WriteFile(HANDLE hFile, //описатель файла
LPCVOID lpBuffer, //указатель на буфер, куда записываются данные
DWORD nNumberOfBytesToWrite,// сколько байт записать
LPDWORD lpNumberOfBytes,// это адрес значения типа DWORD, в которое функция записывает число байтов, записанных с устройства
LPOVERLAPPED lpOverlapped // при выполнении синхронного ввода-вывода должен быть равен NULL);
4. Чтение
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytes, LPOVERLAPPED lpOverlapped );
При успешном завершении функции ReadFile и WriteFile возвращают TRUE.
5. Перемещение файлового указателя
Когда CreateFile возвращает описатель файла, система связывает с этим описателем файловый указатель. Он определяет 64-разрядное смещение внутри файла, начиная с которого будет выполняться очередная операция синхронного чтения или записи. Сначала файловый указатель устанавливается в 0, и, если вызвать ReadFile или WriteFile, то указатель сместиться на количество прочитанных / записанных байтов.
DWORD SetFilePointerEx(
HANDLE hFile, // описатель файла, с которым связан указатель.
LONG lDistanceToMove, // количество байт, на которое необходимо передвинуть указатель файла. Передаваемое число добавляется к текущему значению указателя, поэтому отрицательное число позволяет перемещаться назад.
PLONG lpDistanceToMoveHigh, // перемещения указателя в больших файлах, для которых не хватает 32-битного смещения
DWORD dwMoveMethod //откуда перемещать указатель. FILE_BEGIN – указатель файла устанавливается равным значению параметра liDistanceToMove. FILE_CURRENT – указатель файла увеличивается на liDistanceToMove. FILE_END – указатель файла устанавливается равным сумме логического размера файла и значения параметра liDistanceToMove. );