Указание позиции файла с помощью структуры OVERLAPPED

Указание позиции файла с помощью структуры OVERLAPPED

Для указания позиции в файле Windows предоставляет еще один способ, не требующий использования функции SetFilePointer. Вспомните, что последним параметром в обеих функциях ReadFile и WriteFile является адрес структуры перекрытия OVERLAPPED, который в предыдущих примерах всегда полагался равным NULL. В структуру перекрытия входят элементы Offset и OffsetHigh. Устанавливая соответствующие значения элементов структуры OVERLAPPED, вы можете добиться того, чтобы выполнение операций ввода/вывода начиналось с указанной позиции. В отличие от указателя файла, значение которого изменяется, соответствуя позиции, следующей за последним переданным байтом, значения элементов структуры OVERLAPPED остаются неизменными. Элементом этой структуры является также дескриптор hEvent, значение которого должно устанавливаться равным NULL.

Примечание

Под управлением Windows 9x описанный метод работать не будет, поскольку в этом случае указатель структуры OVERLAPPED при обработке файлов должен устанавливаться равным NULL.

Предостережение

Хотя в рассмотренном примере и используется структура OVERLAPPED, здесь не идет речь о перекрывающемся вводе/выводе, который обсуждается в главе 14.

Использование структуры OVERLAPPED оказывается особенно удобным в тех случаях, когда требуется обновить запись в файле, что иллюстрирует приведенный ниже фрагмент программного кода; в противном случае вы должны были бы перед каждым вызовом функций ReadFile и WriteFile отдельно вызывать функцию SetFilePointer. Последним из пяти полей структуры OVERLAPPED является поле hEvent, как это видно из оператора инициализации. Для хранения вычисленного значения позиции в файле используется переменная FilePos типа LARGE_INTEGER.

OVERLAPPED ov = { 0, 0, 0, 0, NULL };

RECORD r; /* Хотя определение этой структуры не приведено, в ней имеется поле RefCount. */

LONGLONG n;

LARGE_INTEGER FilePos;

DWORD nRead, nWrite;

/* Обновить счетчик, чтобы он соответствовал n-й записи. */

FilePos.QuadPart = n * sizeof(RECORD);

ov.Offset = FilePos.LowPart;

ov.OffsetHigh = FilePos.HighPart;

ReadFile(hFile, r, sizeof(RECORD), &nRead, &ov);

r.RefCount++; /* Обновить запись. */

WriteFile(hFile, r, sizeof(RECORD), &nWrite, &ov); 

Если дескриптор файла был создан за счет вызова функции CreateFile с установленным флагом FILE_FLAG_NO_BUFFERING, то как смещение позиции в файле, так и размер записи (количество байт) должны быть кратными размеру сектора диска. Соответствующую информацию относительно физического диска, включая информацию о размере сектора, возвращает функция GetDiskFreeSpace.

Структуры OVERLAPPED будут вновь использованы далее в этой главе для указания областей блокирования файлов и в главе 14 для выполнения операций асинхронного ввода/вывода и прямого доступа к файлам.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Курсор текущей позиции редактирования

Из книги Видеосамоучитель монтажа домашнего видео в Adobe Premiere Pro CS3 автора Днепров Александр Г

Курсор текущей позиции редактирования Курсор текущей позиции редактирования служит для нахождения нужного кадра в клипе, что позволяет точно произвести монтаж клипов или их подрезку.В верхней части курсора текущей позиции редактирования расположен ползунок, при


Указание источника записей с помощью предложения FROM

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Указание источника записей с помощью предложения FROM Предложение FROM указывает на источник записей, из которого запрос извлекает записи. Этим источником может быть как таблица, так и другой хранимый запрос. У вас также есть возможность отбора записей из нескольких таблиц,


Модификация структуры таблицы с помощью предложения ALTER

Из книги Цифровой журнал «Компьютерра» № 32 [30.08.2010 — 05.09.2010] автора Журнал «Компьютерра»

Модификация структуры таблицы с помощью предложения ALTER С помощью предложения ALTER можно изменить определения полей в таблице. Например, чтобы добавить поле CustomerType в tblCustomer, используйте приведенную ниже команду SQL.ALTER TABLE tblCustomer ADD CustomerType intДля того чтобы удалить поле из базы


Софт: Конвертация любого файла с помощью Zamzar Евгений Крестников

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Софт: Конвертация любого файла с помощью Zamzar Евгений Крестников ОпубликованоЕвгений Крестников Различных онлайн-конвертеров в интернете немало, но этот, пожалуй самый универсальный из всех.Продолжая тему полезных пользователям мобильных


Просмотр XML-файла с помощью объектной модели Internet Explorer 4.0

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Просмотр XML-файла с помощью объектной модели Internet Explorer 4.0 Если требуется только просматривать и анализировать XML-файл, не модифицируя его, то проще всего воспользоваться объектной моделью MSXML, реализованной в Internet Explorer 4.01. Замечание Как отмечено в документации MSDN, эта


Создание макета файла DateArc.wsc с помощью Windows Script Component Wizard (JScript)

Из книги Справочник по PHP автора

Создание макета файла DateArc.wsc с помощью Windows Script Component Wizard (JScript) Из листинга 10.1 можно понять, что создание компонента-сценария связано с написанием большого количества вспомогательного кода (нужно заполнить элементы <registration>, <property>, <method> и <events>, написать


Структуры OVERLAPPED

Из книги Интернет-маркетинг на 100% автора Коллектив авторов

Структуры OVERLAPPED С помощью структуры OVERLAPPED (указываемой, например, параметром lpOverlapped функции ReadFile) можно указывать следующую информацию:• Позицию в файле (64 бита), с которой должно начинаться выполнение операции чтения или записи в соответствии с обсуждением, которое


Положение указателя текущей позиции

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Положение указателя текущей позиции feofУказатель конца файла.Синтаксис:int feof(int $f)Возвращает true, если достигнут конец файла (то есть если указатель файла установлен за концом файла).Пример:$f=fopen("myfile.txt","r");while(!feof($f)){ $str=fgets($f); // Обрабатываем очередную строку


1.3. Мыслите с позиции пользователей

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

1.3. Мыслите с позиции пользователей Парадоксально, но базовая установка маркетинга: «Проектируйте продукт для клиентов, а не для себя» с большим трудом реализуется в сфере веб-разработок. В результате сайт становится площадкой для столкновения корпоративных интересов и


Пример 28-2. Создание файла подкачки (swapfile), с помощью /dev/zero

Из книги автора

Пример 28-2. Создание файла подкачки (swapfile), с помощью /dev/zero #!/bin/bash# Создание файла подкачки.# Этот сценарий должен запускаться с правами root.ROOT_UID=0 # Для root -- $UID 0.E_WRONG_USER=65 # Не root?FILE=/swapBLOCKSIZE=1024MINBLOCKS=40SUCCESS=0if [ "$UID" -ne "$ROOT_UID" ]then echo; echo "Этот сценарий должен запускаться с правами


11.1.13. Указание позиции, с которой начинается сортировка

Из книги автора

11.1.13. Указание позиции, с которой начинается сортировка Иногда в качестве ключа сортировки требуется задать не целое поле, а какую?то его часть. В этом случае после номера поля необходимо через точку указать позицию символа, являющегося первым в ключе.Обратимся к примеру.


18.7.5. Обработка файла с помощью проверок условий

Из книги автора

18.7.5. Обработка файла с помощью проверок условий Большинство циклов while включает некоторый оператор проверки, который уточняет последовательность действий.Ниже рассматривается файл с именами служащих, и на экран выводятся подробности. После обнаружения имени служащего


20.1.3. Преобразования файла с помощью команды shift

Из книги автора

20.1.3. Преобразования файла с помощью команды shift Использование возможностей команды shift значительно облегчает работу с опциями командной строки. Рассмотрим сценарий, выполняющий преобразование регистра символов. При этом будет применяться команда tr.При выполнении


20.2.3. Указание значений опций с помощью команды getopts

Из книги автора

20.2.3. Указание значений опций с помощью команды getopts Иногда для сценариев требуется включение фактического значения одной из опций командной строки. При этом используется команда getopts. Все, что требуется для этого сделать, — вставить двоеточие после буквы опции параметра


28.3. Ускорение работы с помощью файла inittab

Из книги автора

28.3. Ускорение работы с помощью файла inittab Каталог уровня выполнения состоит из набора сценариев, более совершенных, чем службы. Слово "services" в этом контексте означает и демон, и приложение, и серверы, и подсистемы или процессы сценария. Во время загрузки системы вызывается