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

Windows надає прикладним програмам API-функцію CreateFile, яка може використовуватися як для створення нового файлу, так і для відкриття існуючого. У будь-якому випадку ця функція створює в системної пам'яті об'єкт типу «відкритий файл», саме тому назву функції починається зі слова «Create».

Функція CreateFile може використовуватися для роботи з файлами будь-якої файлової системи, підтримуваної Windows (зокрема, FAT і NTFS).

Параметри цієї функції численні і дають досить гарне уявлення про можливості роботи з файлами в Windows. Деякі параметри мають сенс тільки для NTFS (але не для FAT) або тільки для Windows NT (але не для Windows 95). Список параметрів включає в себе наступні параметри.

· Ім'я файлу (включаючи шлях до каталогу, якщо файл розташований не в поточному каталозі). Замість імені файлу може також бути вказано спеціальне ім'я пристрою, в тому числі навіть ім'я фізичного або логічного диска.

· Режим доступу. Може бути вказаний доступ для читання, для запису або їх комбінація.

· Режим поділу. Він може включати в себе дозвіл іншим процесам читати файл, записувати дані в файл, видаляти файл або будь-яку комбінацію цих дозволів, в тому числі, зрозуміло, і відсутність всіх дозволів.

· Атрибути захисту. Їх використання буде описано в п. 3.8.4.2.

· Режим створення. Визначає дії функції у випадках, коли файл із заданим ім'ям вже існує і коли не існує. Визначені наступні режими.

- CREATE_NEW - Створюється новий файл. Якщо файл вже існує, видається помилка.

- CREATE_ALWAYS - Створюється новий файл в будь-якому випадку, навіть якщо файл з таким ім'ям вже існує.

- OPEN_EXISTING - Відкривається існуючий файл. Видає помилку, якщо файл не існує.

- OPEN_ALWAYS - Якщо файл існує, то він відкривається, якщо не існує - створюється новий файл.

- TRUNCATE_EXISTING - Відкривається існуючий файл, але весь його вміст видаляється. Якщо файл не існує, видається помилка.

· Великий набір атрибутів і прапорів, який слід розглянути докладніше. В даному випадку атрибутами називаються ознаки файлу, які встановлюються при його створенні, а прапорами - ознаки, що уточнюють режим роботи з відкритим файлом.

До атрибутів файлу відносяться всі ті, які Windows успадкувала від MS-DOS (тільки для читання, прихований, системний, архівний), а також атрибут «стислий» (тобто файл, що створюється в NTFS, буде зберігатися в стислому вигляді) і атрибут «тимчасовий». Цей атрибут означає, що файл, ймовірно, буде скоро видалений, а тому система повинна спробувати утримати його дані в пам'яті, не витрачаючи даремно час на запис файлу на диск.

Прапори функції надають, зокрема, наступні можливості:

· При операціях запису негайно виконувати запис на диск (очищати кеш-буфера файлу);

· Взагалі виключити використання кеша для даного файлу, завжди записувати і читати сектори даних безпосередньо з диска;

· Вказати системі бажаність оптимальної буферизації для послідовного доступу або, навпаки, для довільного доступу;

· Відкрити файл для виконання асинхронних операцій;

· Вказати системі, що файл повинен бути автоматично видалений відразу ж, як тільки він буде закритий.

Функція CreateFile повертає хендл відкритого файлу. Цей хендл може потім використовуватися при зверненні до функцій читання, записи, переміщення покажчика, очищення буферів, блокування фрагментів, закриття фала та ін

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

Як ви думаєте, чому при асинхронних операціях не використовується покажчик читання / запису?

Процес, що запустив асинхронну операцію читання / запису, може потім перевірити її результат за допомогою виклику системної функції, яка, в залежності від параметрів, або чекає завершення операції, або просто перевіряє, чи завершилася вона. Крім того, є можливість зв'язати із завершенням асинхронної операції або подія (event), або функцію завершення, яка буде викликана, якщо операція завершена, а нитка процесу, що почала операцію, викликала функцію очікування (див. пп.4.5.5.2, 4.5.5.3 про події та функціях очікування).

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

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

· Спеціально для заміни версій системних програм передбачений варіант перейменування / переміщення файлу з відкладанням фактичного виконання до перезавантаження системи. Іншим способом неможливо було б, наприклад, встановити нові версії системних бібліотек, оскільки існуючі версії постійно відкриті і тому не можуть бути видалені інакше як при старті системи.