пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

I семестр:
» прг

Работа с файлами

Файл - поименованная область для хранения данных на диске(жестком, 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

Определяет режим доступа к объекту. Принимает значения:

0 Чтение и запись запрещены.
GENERIC_READ Разрешено только чтение информации из объекта.
GENERIC_WRITE  Разрешена только запись информации в объект.
GENERIC_READ|
GENERIC_WRITE
 
 Разрешены операции чтения и записи.
dwSharedMode

Определяет режим совместного использовании объекта. Принимает значения:

0 Другие процессы не буду иметь доступа к объекту.
FILE_SHARE_READ Другие процессы могут читать, но не могу записывать информацию в файл.
FILE_SHARE_WRITE  Другие процессы могут записывать, но не могу читать информацию из файла.
FILE_SHARE_READ|
FILE_SHARE_WRITE
 
 Другие процессы могут читать и записывать информацию.
lpSecurityAttributes Задаёт информацию о защите объекта. Чаще всего передаётся NULL, что означает использовать атрибуты защиты по умолчанию. 
 
dwCreationDistribution

Описывает поведение функции при открытии файлов, а не других устройств.

Если CreateFile применяется для открытия любого другого устройства, но не файла, применяется только значение OPEN_EXISTING. 
Параметр принимает значения :
CREATE_NEW Cоздает новый файл. Если файл с таким именем существует, функция вернёт ошибку.
CREATE_ALWAYS Всегда создает новый файл. Если файл с таким именем существует, то он будет усечен до нулевой длины и перезаписан.
CREATE_EXISTING Открыть существующий файл. Если файл с таким именем не существует, функция вернёт ошибку.
OPEN_ALWAYS Открыть существующий файл или создать новый, если файл с таким именем не существует.
TRUNCATE_EXISTING Открыть существующий файл, усечь его до нулевой длины. Если файл с таким именем не существует, то возвращается ошибка. 
 
dwFlagsAndAttributes

Системные флаги и атрибуты.  Флаг  принимает значения :

FILE_FLAG_NO_BUFFERING Отключает системное кэширование, т.е. чтение и запись информации будут выполняться напрямую с устройством. 
 
FILE_FLAG_SEQUENTIAL_SCAN Чтение будет идти последовательно, заставляя систему использовать кэширование. Игнорируется, если установлен FILE_FLAG_NO_BUFFERING. 
 
FILE_FLAG_RANDOM_ACCESS Смысл противоположен FILE_FLAG_SEQUENTIAL_SCAN. Кэш меньше, но позиционирование выполняется быстрее. Игнорируется, если установлен FILE_FLAG_NO_BUFFERING 
 
FILE_FLAG_DELETE_ON_CLOSE Файл будет удалён, когда будет закрыт его последний дескриптор, т.е последний пользователь завершит работу с этим файлом. 
 
FILE_FLAG_BACKUP_SEMANTICS Если вызывающий процесс (точнее его марке) имеет привилегии SE_BACKUP_NAME(разрешение резервного копировани) и SE_RESTORE_NAME (смена владельца), то процесс может получить доступ к файлу, перекрывая тем самым стандартную про-верку безопасности. Используется этот флаг в программах резервного копиро-вания и восстановления данных. 
 
FILE_FLAG_POSIX_SEMANTICS Установка этого флага заставляет систе-му учитывать регистр в имени файла. 
 
FILE_FLAG_OPEN_REPARSE_POINT Игнорируется повторная обработка для томов NTFS(например, повторное открытие или создание файла). Функция вернёт дескриптор файла независимо от того установлен ли фильтр дополнительной обработки. Нельзя использовать вместе с флагом CREATE_ALWAYS. 
 
FILE_FLAG_OVERLAPPED Этот флаг включает асинхронный режим работы с файлом, по умолчанию режим работы всегда синхронный. При синхрон-ном режиме функцию ввода или вывода в файл, приостанавливает поток на время выполнения операции ввода-вывода. В асинхронном режиме  функция сразу за-вершается, а ОС по окончании  опера-ции посылает уведомление потоку.
 
 

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

FILE_ATTRIBUTE_ARCHIVE Файл готов к архивированию. Уста-навливается автоматически при создании нового файла.
 
FILE_ATTRIBUTE_ENCRYPTED Файл зашифрован. 
 
FILE_ATTRIBUTE_HIDDEN Файл скрытый. 
 
FILE_ATTRIBUTE_NORMAL Файл не имеет других атрибутов и не комбинируется с другими атри-бутами.
 
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED Файл не будет индексироваться службой индексации. Служба индек-сации индексирует (другими слова-ми выделяет группы файлов - HTML, MS Office, текстовые, почтовые, а также любые другие, для которых имеются фильтры) на жестом диске и во всех доступных сетевых пап-ках.
 
FILE_ATTRIBUTE_OFFLINE К файлу невозможно получить непо-средственный доступ, так как он находится в удалённом хранилище. Атрибут не используется в прило-жениях пользователя. 
 
FILE_ATTRIBUTE_READONLY Файл предназначен только для чте-ния. 
 
FILE_ATTRIBUTE_SYSTEM Файл принадлежит или используется только самой ОС. 
 
FILE_ATTRIBUTE_TEMPORARY При наличии места в кэше, система будет стараться избегать записи содержимого на диск, для ускоре-ния доступа. Если приложение не удалит файл, то данные будут за-писаны на диск после закрытия де-скриптора файла. 
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        -   точка отсчета - конец файла      

 


05.06.2015; 08:13
хиты: 1041
рейтинг:0
Гуманитарные науки
изобразительные искусства
каллиграфия
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь