Блог gunsmoker-а сериализация - загальні відомості про файли

Для початку згадаємо, що таке файл. Файл - це пристрій з послідовним доступом, до якого можна звернутися по імені. Найтиповіший файл - це файл на диску. Але в більш широкому сенсі файлом є і файлові пристрої - начебто мережевого з'єднання, потоків даних, каналів pipe і т.п. Відповідно, операцію запису або завантаження даних з файлів на диску можна розглядати в більш широкому сенсі, стосовно будь-яких файлів.

Файли на зовнішніх пристроях (дисках) часто називають фізичними файлами. Вони мають імена, складені відповідно до правил іменування файлів операційної системи. Наприклад, на Windows це:
  • myfile.txt
  • MyFile.txt
  • C: \ MyFile.txt
  • C: \ MyFolder \ MyFile.txt
  • .\ MyFile.txt
  • .\ .. \ MyFile.txt

    іменування файлів

    Всі файлові системи слідують одній і тій же загальній системі іменування окремих файлів: базове ім'я файлу (MyFile) і додаткове розширення файлу (txt), розділені крапкою. Базове ім'я файлу разом з розширенням файлу називається іменем файлу. (MyFile.txt). Проте, кожна файлова система (на кшталт NTFS, CDFS, ExFAT, UDF, FAT і FAT32) може мати конкретні і інші правила формування окремих компонентів в шляху до каталогу чи файлу. Зверніть увагу, що каталог (також званий Директорією), призначений для упорядкування файлів шляхом угруповання, - це просто файл зі спеціальним атрибутом, який зазначає його як каталог, але в іншому каталоги повинні слідувати все тим же правилам іменування, як і звичайні файли. Оскільки термін "каталог" просто посилається на спеціальний тип файлу, то деякі довідкові матеріали використовують загальний термін "файл", щоб охопити як поняття каталогу, так і поняття файлу даних як такого. Через це, якщо не вказано інше, будь-які імена та правила використання або приклади для файлу застосовні також і до каталогів. Каталог не слід плутати з папкою. Папка - це більш загальне поняття. Каталог завжди фізично представлений на диску, а папка може як бути каталогом, так і представляти віртуальне (логічне) розміщення - наприклад, папка "Мережеве оточення" або "Мій комп'ютер". Каталог самого верхнього рівня на диску називається кореневим. Кореневої каталог завжди єдино, але у кожного диска він свій.

    У кожному каталозі, крім кореневого, існують псевдо-каталоги зі спеціальними зарезервованими іменами. (Точка) і. (Дві точки). Каталог. посилається на цей же каталог, а. - на попередній (батьківський каталог, каталог верхнього рівня).

    Термін "шлях" посилається на один або кілька каталогів (або папок), розділених зворотною косою межею (\ - зворотний слеш, бекслеш, back-slash), і, можливо, на ім'я томи (C:) або ім'я сервера (\\ server . \\? \ UNC \ server або \\? \ C:). Примітка: в деяких далекосхідних версіях Windows для роздільник шляху використовується інший символ. але треба розуміти, що це рівно той же символ (з тим же ANSI-кодом), просто він виглядає інакше.

    Всього в Windows використовується три типи шляхів:
    1. LFS (Local File System) - імена в локальній файловій системі, наприклад: C: \ MyFolder \ MyFile.txt
    2. UNC (Uniform Naming Convention) - мережеві UNC-імена, наприклад: \\ server \ MyFolder \ MyFile.txt
    3. Long UNC або UNCW - довгі імена, наприклад: \\? \ UNC \ server \ MyFolder \ MyFile.txt або \\? \ C: \ MyFolder \ MyFile.txt
    Шлях файлу разом з іменем файлу називається повним ім'ям файлу (C: \ MyFolder \ MyFile.txt). Кожен каталог, ім'я томи і ім'я файлу в дорозі називаються компонентами шляху.

    Один з каталогів на диску є активним для працюючої програми. Він називається поточним каталогом. Поточний каталог завжди один, він задається при запуску програми і може змінюватися в процесі її роботи (шляхом виклику функції зміни каталогу). Поточний каталог є активним, робочим - він використовується при вирішенні імен (див. Нижче). Крім поточного каталогу програми система також окремо відстежує поточний каталог кожного диска. Диск, зазначений в поточному каталозі, називається поточним диском.

    Шлях, що починається з імені томи (C: \ MyFolder \ MyFile.txt), імені сервера (\\ server \ MyFolder \ MyFile.txt) або кореневого каталогу (\ MyFolder \ MyFile.txt) називається абсолютним - бо таке ім'я завжди однозначно вказує на один і той же файл, незалежно від зовнішнього оточення. В іншому випадку шлях називається відносним (на кшталт MyFile.txt. \ MyFile.txt. \ MyFolder \ MyFile.txt або. \ .. \ MyFolder \ MyFile.txt). Відносні шляхи трактуються в залежності від поточного каталогу. Тому один і той же відносний шлях може посилатися на різні файли. Наприклад, шлях MyFile.txt і. \ MyFile.txt посилаються на C: \ MyFolder \ MyFile.txt. якщо поточний каталог (або каталог, щодо якого відбувається дозвіл імені) дорівнює C: \ MyFolder \. але ці ж імена будуть посилатися на D: \ Program Files \ MyFolder \ MyFile.txt. якщо поточний каталог - D: \ Program Files \ MyFolder \. Не слід плутати повне ім'я файлу з абсолютним. Це трохи різні поняття, хоча часто їх розглядають як синоніми. Під повним ім'ям файлу розуміється ім'я файлу з шляхом - ім'я, за яким можна знайти файл. Але воно не повинно бути абсолютним. З іншого боку, будь-який абсолютне ім'я завжди є повним ім'ям. В англійській мові використовується термін "fully-qualified path" ( "повністю зазначений шлях") - це синонім абсолютного шляху файлу.

    Обмеження на кількість символів також можуть бути різні і змінюватися в залежності від файлової системи і способу іменування файлу. Це ускладнюється ще й підтримкою зворотної сумісності. Наприклад, старі файлові системи MS-DOS підтримують максимум 8 символів для базового імені файлу і 3 символу для розширення - в цілому 12 символів, включаючи точку-сепаратор. Крім того, ці імена не могли включати в себе багато символів - наприклад, пробіл. Цей формат імені файлу широко відомий як "формат файлу 8.3" або коротке ім'я файлу. Файлові системи Windows не мають подібного обмеження, і хоча вони підтримують імена формату 8.3 для забезпечення сумісності, в основному вони працюють з довгими іменами файлів.

    Угоди по іменування

    Наступні основні правила дозволяють додаткам створювати і обробляти допустимі імена для файлів і каталогів, незалежно від файлової системи:
    • Використовуйте точку для відділення базового імені файлу від розширення в імені файлу або каталогу. Каталоги можуть мати розширення, хоча зазвичай воно не використовується.
    • Використовуйте зворотну косу риску (\) для поділу компонентів шляху. Зворотна коса риска розділяє ім'я файлу від шляху до нього, і ім'я одного каталогу від іншого каталогу в шляху. Ви не можете використовувати зворотну косу риску як частина імені реального файлу або каталогу, тому що це зарезервований символ, який ділить повне ім'я файлу на компоненти.
    • Використовуйте зворотну косу риску згідно з вимогами як частина імені томи, наприклад, C: \ в C: \ path \ file або \\ server \ share в \\ server \ share \ path \ file.
    • Імена файлів не чутливі до регістру. Наприклад, імена OSCAR. Oscar і oscar посилаються на один і той же файл. Примітка: з метою сумісності з POSIX стандартом ви можете включити чутливість до регістру для файлових імен, але це нестандартну поведінку і воно не рекомендується до використання в загальних сценаріях.
    • Імена томів (літери дисків) також не чутливі до регістру. Наприклад, D: і d: відносяться до одного і того ж тому.
    • Ви можете використовувати будь-який символ для імені файлу, включаючи Unicode символи, за винятком таких спеціальних символів:
      • <(меньше)
      • > (Більше)
      • : (Двокрапка)
      • " (подвійні лапки)
      • / (Коса риска, слеш)
      • \ (Зворотна коса риса, зворотний слеш)
      • | (Вертикальна риса, труба)
      • ? (знак питання)
      • * (Зірочка)
      • Нуль (NUL-символ)
      • Символи, чиї коди лежать в діапазоні від 1 до 31 (за винятком альтернативних потоків даних, де ці символи допускаються)
      • Будь-які інші символи, який не підтримує нижележащих файлова система
    • Використовуйте точку як компонент шляху для подання поточного каталогу, наприклад. \ Temp.txt.
    • Використовуйте дві послідовні точки (.) В якості компонента шляху для подання батьківського каталогу, наприклад. \ Temp.txt.
    • Не використовуйте наступні зарезервовані імена пристроїв для файлових імен: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, # 8203; # 8203; COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 і LPT9. Також уникайте цих імен в базових іменах файлів - наприклад, NUL.txt.
    • Чи не закінчуйте ім'я файлу або каталогу точкою. Хоча нижележащих файлова система може підтримувати такі імена, оболонка Windows, призначений для користувача інтерфейс і прикладні програми - немає. Проте, цілком можливо вказувати точку першим символом імені файлу, наприклад. temp.

    Шлях до вказаного файлу складається з одного або декількох компонентів, розділених спеціальним символом (зворотний слеш), при цьому кожен компонент зазвичай є ім'ям каталогу або ім'ям файлу, але з деякими винятками, обговорюваними нижче. Дуже часто вирішальне значення для інтерпретації шляху в системі має початок шляху - так званий префікс шляху. Цей префікс визначає простір імен для використання з цим шляхом, і, крім того, які спеціальні символи можуть використовуватися в дорозі - включаючи останній символ.

    Якщо якийсь компонент шляху є ім'ям файлу, то він повинен бути останнім компонентом в дорозі.

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

    Абсолютні і відносні шляхи

    Для функцій, що працюють з файлами, ім'я файлу може здаватися щодо поточного каталогу (або якогось іншого, явно вказаного каталогу), або повністю, абсолютно. Файл щодо поточного каталогу, якщо воно не починається з однієї з наступних речей:
    • UNC-ім'я будь-якого формату, яке завжди починається з двох бек-слешів (\\).
    • Позначення диска з бек-слешем, наприклад: C: \ або D: \.
    • Один зворотний бек-слеш, що представляє кореневої каталог - наприклад, \ folder або \ file.txt.
    Якщо ім'я файлу починається тільки з позначення диска, але без бек-слеша після двокрапки, то воно інтерпретується як відносний шлях - щодо поточного каталогу на заданому диску. наприклад:
    • C: tmp.txt посилається на файл з ім'ям tmp.txt в поточному каталозі на диску С.
    • C: Temp \ tmp.txt посилається на файл tmp.txt в папці Temp поточного каталогу диска С.
    Іноді шлях також називають відносним, якщо він містить каталог. в якості одного зі своїх компонентів. Наприклад:
    • . \ Tmp.txt вказує на файл з ім'ям tmp.txt. розташований в батьківському каталозі поточного каталогу.
    • . \ .. \ tmp.txt вказує на файл, що знаходиться на дві теки вище поточного каталогу.
    • . \ Temp \ tmp.txt вказує на файл з ім'ям tmp.txt. що знаходиться в каталозі Temp. який в свою чергу знаходиться в батьківському каталозі поточного каталогу.
    • C. \ Temp \ tmp.txt вказує на файл з ім'ям tmp.txt. що знаходиться в каталозі Temp. який в свою чергу знаходиться в батьківському каталозі поточного каталогу диска C.
    • C: \ Temp \ .. \ Temp \ tmp.txt і C: \ Temp \. \ Tmp.txt - ці два шляхи посилаються на файл C: \ Temp \ tmp.txt. Хоча ніхто не буде ставити шлях в такому вигляді, але подібні шляхи можуть виходити після склейки повного шляху з декількох компонентів з різних джерел. Хоча шлях такого виду є абсолютним (не стосовно) в сенсі вихідного визначення, іноді його все ж називають відносним, підкреслюючи наявність компонента. в дорозі.

    Максимальне обмеження довжини шляху

    У Windows максимальна довжина шляху дорівнює MAX_PATH символів, де MAX_PATH визначена як константа, рівна 260 - за деякими винятками, обговорюваними нижче. Локальний шлях складається з наступної послідовності: буква диска, двокрапка, бек-слеш, компоненти імені, розділені бек-слеш. Наприклад, максимальний шлях на диску D має вигляд D: \ якісь-256-символів-шляху (і ще один символ, до 260, займає терминирующего нуль).

    У Windows також є функції, які дозволяють використовувати розширені шляху файлів. Для таких шляхів обмеження на максимальну довжину імені одно 32'767 символів. А кожен компонент в дорозі обмежений значенням, що залежать від файлової системи - як правило, 255 символів. Подібні шляху задаються (і трактуються) спеціальним чином. Для завдання такого шляху потрібно використовувати префікс \\? \. наприклад: \\? \ D: \ дуже-довгий-шлях або \\? \ UNC \ server \ дуже-довгий-шлях.

    Подібні імена можна використовувати тільки в Unicode-функціях Windows. До них (іменах) слід ставитися з обережністю з двох причин. По-перше, звичайні програми не зможуть отримати доступ до файлів і каталогів, імена яких перевищать типове обмеження в MAX_PATH. По-друге, UNCW-імена передаються нижележащей файлової системи "як є", минаючи звичайний шар нормалізації шляхів. Наприклад, / НЕ буде замінений на \, імена. (Дві точки) і. (Одна точка) ні бути спеціальними і не будуть розгортатися в реальні імена каталогів. Ось чому і з'являється можливість задавати імена понад 260 символів в шляху (а також імена з іменами, інакше вважаються неприпустимими - скажімо, з точкою на кінці) - тому що імена передаються файлової системи без обробки, так що шар нормалізації не накладаються обмеження в 260 символів (і інші правила файлових імен Windows).

    простори назв

    Для дослідження простору імен ви можете використовувати утиліту WinObj від SysInternals.

    Файлові простору імен Win32

    До них відносяться імена, що починаються з \\? \ - ми вже розібрали їх вище.

    Префікси виду C: \ є псевдонімами.

    Простори назв пристроїв Win32

    Для доступу до пристроїв замість фізичних файлів використовується простір імен пристроїв. Для вказівки шляху при цьому використовується префікс \\. \ (Два бек-слеша, точка, бек-слеш). Наприклад, так ви можете отримати доступ до диска як фізичному пристрою, без звернення до файлової системи. Але, звичайно ж, "пристрою" не обмежуються тільки дисками.

    Наприклад, якщо ви хочете відкрити порт послідовної зв'язку номер 1, то ви можете використовувати ім'я COM1 в виконанні функції CreateFile. Це працює, тому що COM1-COM9 є частиною зарезервованих імен в просторі імен NT. Це працює як псевдонім на пристрій, хоча ви можете і явно вказувати префікс \\. \. Для порівняння: якщо раптом у вас є сто COM-портів і вам треба звернутися до 56-му COM-порту, то ви не зможете відкрити його по імені COM56 - тому що для нього немає ніякого зумовленого псевдоніма або резервування. Вам потрібно буде відкрити його по імені \\. \ COM56.

    Простори назв NT

    Існують також API функції, які дозволяють використовувати іменування в стилі NT, але в більшості випадків це не потрібно. Для найбільш затребуваних об'єктів створюються посилання (псевдоніми), щоб до них можна було отримати доступ, використовуючи звичайні функції. Наприклад, до простору імен NT відносяться такі речі як Serial0 і Serial1. HarddiskVolume1 і Harddisk0. але зазвичай з ними працюють через простір імен Win32, використовуючи такі імена як C: і \\. \ PhysicalDrive0.

    Як вже було сказано, інші простори імен реалізуються поверх простору імен NT. Наприклад, для реєстру в корені створюється елемент REGISTRY. об'єкти ядра знаходяться в KernelObjects. про пристрої і файли Win32 я вже говорив, тут же знаходяться і сесії і, скажімо, глобальні та локальні імена об'єктів IPC і так далі.

    На цьому я закінчую розповідь про файли і переходжу до власне сериализации даних.