Доступ до даних

У MS-DOS існує два різних набору функцій, що дозволяють працювати з даними файлів. Один з них, заснований на використанні блоку управління файлом (FCB), навряд чи кимось використовувався в останні 20 років, проте зберігається з міркувань сумісності з версією MS-DOS 1.0. Загальноприйнятий метод роботи з файлами заснований на використанні хендл [6].

Щоб відкрити існуючий файл, слід викликати відповідну функцію, вказавши в якості параметрів ім'я файлу і бажаний режим доступу (один з трьох: тільки читання, тільки запис, читання і запис). У більш пізніх версіях MS-DOS з'явилася також можливість вказувати режим поділу, як розглянуто в п.3.5. Будь-який файл розглядається як послідовність байт, а якщо програма воліє розглядати файл як набір записів, то вона повинна сама вести перерахунок номера запису в зсув (в байтах) від початку файлу. Операції читання і запису завжди виконуються від поточної позиції, яка називається покажчиком читання / запису, і призводять до зміщення покажчика вперед на прочитане або записане кількість байт. Можливість довільного доступу до даних забезпечується операціями переміщення покажчика.

Хендл - це деяке число, яке система повертає користувача програмі при вдалому виконанні операції відкриття або створення файлу. Значення цього числа не грає ролі для програми. Важливо лише те, що при наступних зверненнях до відкритого файлу програма повинна передавати цей хендл системі як покажчик на цей файл.

MS-DOS надає цілком достатній набір функцій для роботи з відкритими файлами. Сюди включаються функції читання і запису довільного числа байтів, функція переміщення покажчика в довільну точку файлу, функції установки і зняття блокування фрагментів файлу, примусового очищення кеш-буферів файлу (зазвичай очищення виконується тільки при закритті файлу або при браку буферів, див. п.2.6 .6; примусова очищення гарантує негайне збереження змін на диску).

При виклику функції відкриття файлу можна замість імені файлу вказати ім'я будь-якого символьного пристрою, наприклад, «PRN:». При цьому також повертається хендл, з яким можна виконувати операції запису так само, як якщо б цей хендл вказував на дисковий файл. Зрозуміло, не можна відкрити принтер для читання, а також не можна виконувати переміщення покажчика назад.

При запуску будь-якої програми вона отримує «в подарунок» від MS-DOS п'ять вже відкритих хендл з номерами від 0 до 4. З них найбільш важливими є хендл 0, який за визначенням вказує на стандартний ввід програми, і хендл 1 - стандартний вивід. Хендл 2 означає стандартний пристрій для виведення повідомлень про помилки, хендл 3 - стандартний пристрій послідовного введення / виводу (COM-порт), хендл 4 - стандартний принтер.

Вище, в п. 2.2, давалося інше визначення стандартного вводу і виводу, як пристроїв, що використовуються «за замовчуванням». Тут немає протиріччя. Компілятори мов програмування, зустрічаючи виклики процедур вводу / виводу без вказівки файлу, транслюють їх у виклики системних функцій MS-DOS з хендл, відповідно, 0 або 1.

Якщо програма запускається з командного рядка MS-DOS, то зазвичай хендл 0 вказує на клавіатуру (точніше, на пристрій CON :), а хендл 1 - на екран монітора (теж пристрій CON:, але працююче на висновок). Однак користувач може використовувати символи перенаправлення стандартного введення (знак «<») і виводу (знаки «>» і «>>»). Наприклад, програма, запущена за допомогою команди «MY_PROG <INFILE.TXT> PRN» буде використовувати в якості стандартного вводу файл INFILE.TXT, а стандартний висновок направить на принтер. Знак «>>» означає додавання даних у кінець файлу стандартного виводу, знак «>» - перезапис файлу заново. Щоб виконати зазначене користувачем перенаправлення стандартного введення або виведення, система відкриває заданий файл або пристрій (а при знаку «>>» ще й виконує переміщення покажчика в кінець файлу) і забезпечує доступ до нього з запускається програми через стандартний хендл 0 або 1. Таким чином, працююча програма взагалі не знає, які саме пристрої або файли є її стандартним вводом і виводом.

Перенаправлення стандартного введення і виведення може бути виконане і програмою користувача. Зазвичай це робиться перед тим, як дана програма запускає яку-небудь іншу програму, передаючи їй переслані стандартні хендл.