Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
22 - 26.docx
Скачиваний:
1
Добавлен:
21.04.2019
Размер:
28.79 Кб
Скачать

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. );

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]