Указание позиции файла с помощью структуры 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 для выполнения операций асинхронного ввода/вывода и прямого доступа к файлам.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Структуры OVERLAPPED
Структуры OVERLAPPED С помощью структуры OVERLAPPED (указываемой, например, параметром lpOverlapped функции ReadFile) можно указывать следующую информацию:• Позицию в файле (64 бита), с которой должно начинаться выполнение операции чтения или записи в соответствии с обсуждением, которое
Просмотр XML-файла с помощью объектной модели Internet Explorer 4.0
Просмотр XML-файла с помощью объектной модели Internet Explorer 4.0 Если требуется только просматривать и анализировать XML-файл, не модифицируя его, то проще всего воспользоваться объектной моделью MSXML, реализованной в Internet Explorer 4.01. Замечание Как отмечено в документации MSDN, эта
Создание макета файла DateArc.wsc с помощью Windows Script Component Wizard (JScript)
Создание макета файла DateArc.wsc с помощью Windows Script Component Wizard (JScript) Из листинга 10.1 можно понять, что создание компонента-сценария связано с написанием большого количества вспомогательного кода (нужно заполнить элементы <registration>, <property>, <method> и <events>, написать
Положение указателя текущей позиции
Положение указателя текущей позиции feofУказатель конца файла.Синтаксис:int feof(int $f)Возвращает true, если достигнут конец файла (то есть если указатель файла установлен за концом файла).Пример:$f=fopen("myfile.txt","r");while(!feof($f)){ $str=fgets($f); // Обрабатываем очередную строку
1.3. Мыслите с позиции пользователей
1.3. Мыслите с позиции пользователей Парадоксально, но базовая установка маркетинга: «Проектируйте продукт для клиентов, а не для себя» с большим трудом реализуется в сфере веб-разработок. В результате сайт становится площадкой для столкновения корпоративных интересов и
Курсор текущей позиции редактирования
Курсор текущей позиции редактирования Курсор текущей позиции редактирования служит для нахождения нужного кадра в клипе, что позволяет точно произвести монтаж клипов или их подрезку.В верхней части курсора текущей позиции редактирования расположен ползунок, при
Указание источника записей с помощью предложения FROM
Указание источника записей с помощью предложения FROM Предложение FROM указывает на источник записей, из которого запрос извлекает записи. Этим источником может быть как таблица, так и другой хранимый запрос. У вас также есть возможность отбора записей из нескольких таблиц,
Модификация структуры таблицы с помощью предложения ALTER
Модификация структуры таблицы с помощью предложения ALTER С помощью предложения ALTER можно изменить определения полей в таблице. Например, чтобы добавить поле CustomerType в tblCustomer, используйте приведенную ниже команду SQL.ALTER TABLE tblCustomer ADD CustomerType intДля того чтобы удалить поле из базы
Пример 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" в этом контексте означает и демон, и приложение, и серверы, и подсистемы или процессы сценария. Во время загрузки системы вызывается
Софт: Конвертация любого файла с помощью Zamzar Евгений Крестников
Софт: Конвертация любого файла с помощью Zamzar Евгений Крестников ОпубликованоЕвгений Крестников Различных онлайн-конвертеров в интернете немало, но этот, пожалуй самый универсальный из всех.Продолжая тему полезных пользователям мобильных