Насколько выгоднее использовать отображение файлов в память вместо традиционных операций файлового ввода/вывода? Программа, использующая отражение файлов в память, выглядит несколько элегантнее, чем программа, основанная на классическом файловом вводе/выводе. А что насчет производительности? Листинг 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). Эта структура определяет, будут ли дочерние процессы наследовать дескриптор и какие параметры безопасности будут использоваться при доступе к файлу.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.