172
ції зчитування з файла. Існують й інші, цікавіші способи синхро-
нізації, наприклад використання порту завершення введення-
виведення (IoCompletitionPort). Детальніше можливості асинх-
ронного введення-виведення описані у відповідній літературі.
Результат роботи даної програми практично нічим не відрізня-
ється від звичайного синхронного читання і в такому вигляді ве-
ликого сенсу не має. Проте якщо між операціями читання і син-
хронізації змусити програму виконувати яку-небудь корисну ро-
боту, то ресурси комп’ютера використовуватимуться ефективні-
ше, оскільки процесор і пристрій введення працюватимуть пара-
лельно.
Операція позиціонування у випадку синхронного доступу
до файла
Отже, у випадку асинхронного доступу позиція, починаючи з
якої здійснюватиметься операція читання-запису, міститься в за-
питі на операцію (параметр структури OVERLAPPED). Розгляне-
мо тепер особливості позиціонування при звичайному синхро-
нному введенні-виведенні. В цьому випадку реалізується схема зі
"збереженням стану", 64-розрядний покажчик поточної для чи-
тання-запису позиції зберігається у складі атрибутів об’єкта "від-
критий файл" (його не потрібно плутати з атрибутами файла),
описувач якого повертає функція CreateFile.
Поточна позиція зміщується на кінець ліченої або записаної
послідовності байтів у результаті операцій читання або запису.
Крім того, можна встановити поточну позицію за допомогою
Win32-функції SetFilePointer. Наприклад, операція
SetFilePointer(hFile, 17, NІL, FILE_BEGIN);
встановлює покажчик поточної позиції на 17-й байт з початку
файла.
Той факт, що покажчик поточної позиції є атрибутом об’єкта
"відкритий файл", а не самого файла, означає, що той самий файл
можна відкрити повторно з іншим описувачем. При цьому для
одного і того ж файла існуватимуть два різні об’єкти з двома різ-
ними покажчиками поточних позицій. Очевидно, що зміна пото-
чної позиції при роботі з файлом через різні об’єкти відбувати-
меться незалежно.