Асинхронный файловый ввод/вывод в операционной системе WINDOWS, страница 16

Насколько выгоднее использовать отображение файлов в память вместо традиционных операций файлового ввода/вывода? Программа, использующая отражение файлов в память, выглядит несколько элегантнее, чем программа, основанная на классическом файловом вводе/выводе. А что насчет производительности? Листинг 5 содержит стандартную реализацию  процесса.

Листинг 5 Версия NTCAD с традиционным файловым выводом

#include <windows.h>

void MB(char *s)

{

MessageBox(NULL,s,NULL,MB_OK|MB_ICONSTOP);

}

void docat(char *fname)

{

HANDLE f=CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);

HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);

if (f==INVALID_HANDLE_VALUE)

{

MB("Не могу открыть файл");

exit(1);

}

char buf[4096];

unsigned long n;

do

{

unsigned long wct;

if (!ReadFile(f,buf,sizeof(buf),&n,NULL)) break;

if (n) WriteFile(out,buf,n,&wct,NULL);

} while (n==sizeof(buf)); 

CloseHandle(f);

}

void main(int argc,char *argv[])

{

if (argc==1)

{

MB("Usage: ntcat FILENAME [FILENAME ....]");

exit(9);

}

// Обработать все файлы

while (--argc) docat(*++argv);

exit(0);

}

Сравните скорости работы этих программ и характер обращений системы к винчестеру (хотя бы по звуку частоты перемещения магнитной головки).

Заключение

Обязаны ли вы всегда использовать CreateFile и остальные связанные с этим вызовы для того, чтобы работать с файлами в Windows? He всегда. Если вы ориентируетесь на традиционные методики работы с файлами, вы можете продолжать использовать fopen, MFC-класс CFile, VCL, потоки C++ или любой другой традиционный метод, к которому вы привыкли. Однако, если вы желаете воспользоваться специальными возможностями Windows (такими как, например, перекрывающийся ввод/вывод), вам придется применить системный вызов CreateFile и все связанные с ним вызовы, так как большинство библиотек не поддерживают технологий, являющихся особенностью Windows.

Конечно же, прибегать к помощи перекрывающегося ввода/вывода требуется относительно редко. Чаще всего эта технология используется в ситуации, когда программа осуществляет чтение или запись, обращаясь к источнику данных, который может быть не готов к обработке запроса (например, последовательный порт, именованный канал или сокет). Перекрывающийся ввод/вывод также может использоваться для обмена данными с несколькими объектами одновременно, а также для высокоскоростного обмена данными.

Сводка  операций, которые должны быть изучены к защите лабораторной работы:

Открытие файла

Чтобы открыть файл на низком уровне, используйте системный вызов CreateFile. Название вызова (create file — создать файл) подобрано не совсем удачно, так как эта функция может не только создать новый файл, но и открыть уже существующий. Название CreateFilеНаndlе (создать дескриптор файла) было бы более уместным, однако вызов называется CreateFile.

При обращении к вызову CreateFile вы передаете ему набор аргументов (см. табл. 1), управляющих операцией создания дескриптора. Функция возвращает дескриптор открытого ей файла.

Первый аргумент функции CreateFile — это имя файла. Второй аргумент определяет метод доступа. Это может быть GENERIC_READ (чтение), GENERIC_WRITE (запись) или оба этих значения, объединенные оператором | (логическое ИЛИ). Если вы не хотите, чтобы создаваемый дескриптор использовался совместно несколькими процессами, вы должны присвоить третьему аргументу значение 0 (ноль).

Четвертый аргумент — это указатель на структуру SECURITY_ATTRIBUTES (обычно этот аргумент имеет значение NULL). Эта структура определяет, будут ли дочерние процессы наследовать дескриптор и какие параметры безопасности будут использоваться при доступе к файлу.