Файл - поименованная область для хранения данных на диске(жестком, CD, DVD) или другом носителе, например, флешке. Файл - объект ядра операционной системы Windows, это значит, что объект ядра создается пользовательской программой, но только операционная система принимает решение о уничтожении объекта. Объект может быть уничтожен тогда и только тогда, когда число пользователей объекта равно нулю. Как известно, несколько программ одновременно могут использовать один и тот же объект ядра - файл. Работы с объектами ядра, как правило, выполняется с помощью API-функций ( API - Application Programming Interface - интерафсу прикладного программирования), которым передается дескриптор объекта.
7.1 Функция CreateFile
Функция CreateFile создаёт или открывает файл, директорию, физический диск, логический том, консольный буфер, ленточное устройство, коммуникационный ресурс, майлслот или именованный канал. Функция возвращает дескриптор для доступа к объекту.
HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
Параметры
lpFileName | Указатель на оканчивающуюся нулём строку, специфицирующую имя объекта. В ANSI версии длина ограничена значением MAX_PATH. Также при вызове Юникод версии необходимо передавать полный путь к объекту и помнить, что максимальная длина компонента пути не может превышать MAX_PATH. Примеры задания имён различных устройств \\.\PHYSICALDRIVE0 – первый физический диск \\.\C: – логический том «С». \\.\TAPE0 – первый ленточный накопитель. |
||||||||||||||||||||||||||||||||||
dwDesiredAccess |
Определяет режим доступа к объекту. Принимает значения:
|
||||||||||||||||||||||||||||||||||
dwSharedMode |
Определяет режим совместного использовании объекта. Принимает значения:
|
||||||||||||||||||||||||||||||||||
lpSecurityAttributes | Задаёт информацию о защите объекта. Чаще всего передаётся NULL, что означает использовать атрибуты защиты по умолчанию. |
||||||||||||||||||||||||||||||||||
dwCreationDistribution |
Описывает поведение функции при открытии файлов, а не других устройств. Если CreateFile применяется для открытия любого другого устройства, но не файла, применяется только значение OPEN_EXISTING.Параметр принимает значения :
|
||||||||||||||||||||||||||||||||||
dwFlagsAndAttributes |
Системные флаги и атрибуты. Флаг принимает значения :
Атрибуты файла
|
||||||||||||||||||||||||||||||||||
hTemplateFile | NULL или дескриптор открытого ранее файла, тогда атрибуты этого файла используются при создании нового файла с режимом GENERIC_READ. Если открывается существующий файл, то этот параметр игнорируется. |
Успешный вызов функции возвращает дескриптор устройства или файла. В случае ошибки возвращается значение INVALID_HANDLE_VALUE.
7.2 Функция WriteFile
Функция WriteFile записывает информацию в файл с текущей позиции в файле. Эта функция предназначена для синхронной и асинхронной операции записи. Функция WriteFileEx предназначена только для асинхронной операции.
BOOL WriteFile ( HANDLE hFile, // дескриптор файла LPCVOID lpBuаfer, // буфер данных DWORD nNumOfBytesToWrite, // число байтов для записи LPDWORD lpNumOfBytesWritten, // число записанных байтов LPOVERLAPPED lpOverlapped // асинхронный буфер );
Параметры функции
hFile | Дескриптор файла. Дескриптор файла, должен быть создан с правом доступа GENERIC_WRITE. |
lpBuffer | Указатель на буфер, содержащий данные, которые должны быть записаны в файл. |
nNumrOfBytesToWrite | Число байтов, которые должны быть записаны в файл. |
lpNumOfBytesWritten | Указатель на переменную, которая получает число реально записанных байтов. |
lpOverlapped | NULL или указатель на структуру OVERLAPPED. Эта структура требуется , если параметр hFile создавался с флажком FILE_FLAG_OVERLAPPED. |
7.3 Функция ReadFile
Функция ReadFile читает данные из файла, начиная с текущей позиции файла, предназначена и для синхронной и асинхронной операций. После того, как операция чтения была закончена, указатель файла перемещается на число действительно прочитанных байтов, если выполняется синхронная операция чтения. При использовании асинхроной операции приложение должно самостоятельно переместить позицию указателя файла после операции чтения. Аргументы функции аналогичны вргументам для функции записи.
BOOL ReadFile( HANDLE hFile, // дескриптор открытого файла LPVOID lpBuffer, // буфер для чтения данных DWORD nNumOfBytesToRead, // требуемое число байтов для чтения LPDWORD lpNumOfBytesRead, // число реально прочитанных байтов LPOVERLAPPED lpOverlapped // асинхронный буфер );
Функция ReadFile возвращает значение тогда, когда выполнено одно из ниже перечисленных условий:
- операция записи завершается на записывающем конце канала, - затребованное число байтов прочитано, - или происходит ошибка.
Если функция завершается успешно, величина возвращаемого значения - не ноль. Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Для получения дополнительных сведений об ошибке вызовам функцию GetLastError(), в документации ищем сведения об ошибках. Описание многих, хотя и не всех ошибок можно найти по адресу
http://www.inetkomp.ru/stati/277-error.html.
7. 4 Функция GetFileSize
Функция GetFileSize возвращает размер указанного файла в байтах. Возвращаемое значение ограничено значением двойного слова (DWORD). В случае размера, превышающего двойное слово, результат функции можно понимать как младшее двойное слово, а второй параметр - старшее двойное слово. Если функция завершается ошибкой, возвращаемое значение - INVALID_FILE_SIZE. Чтобы получить дополнительные данные об ошибке, следует вызвать GetLastError.
DWORD GetFileSize ( HANDLE hFile, // дескриптор файла LPDWORD lpFileSizeHigh // старшее слово размера файла );
ПРИМЕР чтения и записи в файл
#include "windows.h" #include <iostream> using namespace std; HANDLE hFile; TCHAR * msg; DWORD size, size_Hight ; DWORD n, nwr; bool t ; void Test() (фиг ск откр) setlocale(LC_ALL,"RUSSIAN"); hFile = CreateFile ( _T("Input.txt"), // имя файла GENERIC_READ | GENERIC_WRITE, // открыть для чтения и записи FILE_SHARE_READ, // другие процессы могут только читать NULL, // атрибуты безопасности по умолчанию OPEN_ALWAYS, // всегда открывать файл, // если не существует, то создать, // если существует, усечь до нулевой длины FILE_ATTRIBUTE_NORMAL, // не устанавливать атрибуты NULL // не использовать файл-шаблон ); if (hFile == INVALID_HANDLE_VALUE) фсо printf( "Не могу открыть файл Input.txt\n") ; return ; фсз size = GetFileSize ( hFile, &size_Hight); printf( "size = %d\n", size) ; msg = L"Это моя текстовая строка "; n = wcslen(msg); // длина строки в символах WriteFile(hFile,msg, 2*n, &nwr, NULL); // запись строки, символы 2-байтовые size = GetFileSize ( hFile, &size_Hight); printf( "n = %d nwr =%d size = %d\n", n, nwr, size) ; int x = 123; double y =3.141592; WriteFile(hFile, &x, 4, &nwr, NULL); // запись числовой информации WriteFile(hFile, &y, 8, &nwr, NULL); CloseHandle(hFile); // Закрытие файла size = GetFileSize ( hFile, &size_Hight); printf( "size = %d\n", size) ; hFile = CreateFile // повторное открытие файла ( _T("Input.txt"), GENERIC_READ, // открыть только для чтения FILE_SHARE_READ, // другие процессы могут только читать NULL, // атрибуты безопасности по умолчанию OPEN_EXISTING, // открыть существующий файл FILE_ATTRIBUTE_NORMAL, // не устанавливать атрибуты NULL // не использовать файл-шаблон ); size = GetFileSize ( hFile, &size_Hight); msg =NULL; msg = new TCHAR[n+1]; char * buf = (char*)((void*)msg); //чтение 2*т байтов, составляющих ReadFile(hFile, buf, 2*n, &nwr, NULL); //текстовую строку printf( "n = %d nwr =%d size = %d t=%d GetLastError()=%d\n", n, nwr, size, t, GetLastError()) ; msg[n] =(TCHAR)'\0'; wprintf( L"msg = %s\n", msg) ; int x1 ; double y1 ; ReadFile(hFile, &x1, 4, &nwr, NULL); //чтение числовой информации ReadFile(hFile, &y1, 8, &nwr, NULL); printf ("x1=%d y1=%10.6f\n", x1, y1); CloseHandle(hFile); // Закрытие файла фсз Результат работы программы size = 58 n = 29 nwr =58 size = 58 size = -1 n = 29 nwr =58 size = 58 t=1 GetLastError()=0 msg = Это моя текстовая строка x1=123 y1= 3,141592
7.5 Функция SetFilePointer
Функция перемещает указатель позиции в открытом файле, указатель позиции в файле сохраняется в двух значениях типа LONG. Если функция завершается ошибкой, возвращаемое значение - INVALID_SET_FILE_POINTER.
DWORD SetFilePointer( HANDLE hFile, LONG lDistToMove, PLONG lpDistToMoveHigh, DWORD dwMoveMethod );
hFile | Дескриптор открытого файла. |
lDistToMove | Младшее 32-разрядное слово со знаком, устанавливающее число байтов, на которое переместится указатель позиции в файле. Положительное значение отвечает продвижение вперед, отрицательное - назад. |
lDistToMoveHigh | Старшее 32-разрядное слово со знаком, устанавливающее число байтов, на которое переместится указатель позиции в файле. Если старшее слово не нужно, то оно устанвливается в 0. |
dwMoveMethod | Определяет точку отсчета перемещения указателя. Принимает значения:
FILE_BEGIN - точка отсчета - начало файла FILE_CURRENT - точка отсчета - текущая позиция FILE_END - точка отсчета - конец файла |