Для доступа к компонентам файла что используется

Обновлено: 06.07.2024

. when altering one's mind becomes as easy as programming a computer, what does it mean to be human.

10 сентября 2011 г.

Сериализация - общие сведения о файлах

Именование файлов

Все файловые системы следуют одной и той же общей системе именования отдельных файлов: базовое имя файла ( MyFile ) и дополнительное расширение файла ( txt ), разделенные точкой. Базовое имя файла вместе с расширением файла называется именем файла: ( MyFile.txt ). Тем не менее, каждая файловая система (вроде NTFS, CDFS, ExFAT, UDF, FAT и FAT32) может иметь конкретные и иные правила формирования отдельных компонентов в пути к каталогу или файлу. Обратите внимание, что каталог (также называемый директорией ), предназначенный для упорядочивания файлов путём группировки, - это просто файл со специальным атрибутом, отмечающим его как каталог, но в остальном каталоги должны следовать всё тем же правилам именования, как и обычные файлы. Поскольку термин "каталог" просто ссылается на специальный тип файла, то некоторые справочные материалы используют общий термин "файл", чтобы охватить как понятия каталога, так и понятие файла данных как такового. Из-за этого, если не указано иное, любые имена и правила использования или примеры для файла применимы также и к каталогам. Каталог не следует путать с папкой. Папка - это более общее понятие. Каталог всегда физически представлен на диске, а папка может как быть каталогом, так и представлять виртуальное (логическое) размещение - к примеру, папка "Сетевое окружение" или "Мой компьютер". Каталог самого верхнего уровня на диске называется корневым. Корневой каталог всегда единственен, но у каждого диска он свой.

В каждом каталоге, кроме корневого, существуют псевдо-каталоги со специальными зарезервированными именами . (точка) и .. (две точки). Каталог . ссылается на этот же каталог, а .. - на предыдущий (родительский каталог, каталог верхнего уровня).

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

  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 ), имени сервера ( \\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 (за исключением альтернативных потоков данных, где эти символы допускаются)
    • Любые другие символы, который не поддерживает нижележащая файловая система

    Путь к указанному файлу состоит из одного или нескольких компонентов, разделенных специальным символом (обратный слэш), при этом каждый компонент обычно является именем каталога или именем файла, но с некоторыми исключениями, обсуждаемыми ниже. Очень часто решающее значение для интерпретации пути в системе имеет начало пути - так называемый префикс пути. Этот префикс определяет пространство имён для использования с этим путём, и, кроме того, какие специальные символы могут использоваться в пути - включая последний символ.

    Если какой-то компонент пути является именем файла, то он должен быть последним компонентом в пути.

    Каждый компонент пути также имеет ограничение на максимальную длину имени, зависящее от конкретной файловой системы. Чаще всего, эти ограничения сводятся к двум основным группам: короткие и длинные имена файлов. Обратите внимание, что имена каталогов хранятся в файловой системе как особый тип файлов, так что правила именования файлов распространяются также на названия каталогов. Подводя итог: путь - это просто строковое представление иерархии между всеми каталогами, которые существуют для определённого файла или каталога.

    Абсолютные и относительные пути

    • 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).

    Пространства имён

    Префикс имени файла определяет пространство имён, к которому принадлежит путь. Существуют две основные категории пространств имён, используемые в Windows API: пространства имён NT и пространств имён Win32. Пространство имён NT было разработано как пространство имён низкого уровня, корневым пространством имён, поверх которого могли бы существовать другие пространства имён - включая подсистему Win32 и, как следствие, пространство имён Win32. POSIX является еще одним примером подсистемы в Windows, которая построена поверх NT.

    Для исследования пространства имён вы можете использовать утилиту 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 и так далее.

    Напоминаю, что вы можете использовать утилиту WinObj для просмотра пространств имён.

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



    Что может быть проще, чем разграничить права на папку в NTFS? Но эта простая задача может превратиться в настоящий кошмар, когда подобных папок сотни, если не тысячи, а изменение прав к одной папке «ломает» права на другие. Чтобы эффективно работать в подобных условиях, требуется определенная договоренность, или стандарт, который бы описывал, как решать подобные задачи. В данной статье мы как раз и рассмотрим один из вариантов подобного стандарта.

    Стандарт управления правами доступа к корпоративным файловым информационным ресурсам (далее – Стандарт) регламентирует процессы предоставления доступа к файловым информационным ресурсам, размещенным на компьютерах, работающих под управлением операционных систем семейства Microsoft Windows. Стандарт распространяется на случаи, когда в качестве файловой системы используется NTFS, а в качестве сетевого протокола для совместного доступа к файлам SMB/CIFS.

    Информационный ресурс – поименованная совокупность данных, к которой применяются методы и средства обеспечения информационной безопасности (например, разграничение доступа).
    Файловый информационный ресурс – совокупность файлов и папок, хранящихся в каталоге файловой системы (который называется корневым каталогом файлового информационного ресурса), доступ к которой разграничивается.
    Составной файловый информационный ресурс – это файловый информационный ресурс, содержащий в себе один или несколько вложенных файловых информационных ресурсов, отличающихся от данного ресурса правами доступа.
    Вложенный файловый информационный ресурс – это файловый информационный ресурс, входящий в составной информационный ресурс.
    Точка входа в файловый информационный ресурс – каталог файловой системы, к которому предоставляется сетевой доступ (shared folder) и который используется для обеспечения доступа к файловому информационному ресурсу. Данный каталог обычно совпадает с корневым каталогом файлового информационного ресурса, но может быть и вышестоящим.
    Промежуточный каталог – каталог файловой системы, находящийся на пути от точки входа в файловый информационной ресурс к корневому каталогу файлового информационного ресурса. Если точка входа в файловый информационный ресурс является вышестоящим каталогом по отношению к корневому каталогу файлового информационного ресурса, то она также будет являться промежуточным каталогом.
    Группа доступа пользователей – локальная или доменная группа безопасности, содержащая в конечном счете учетные записи пользователей, наделенные одним из вариантов полномочий доступа к файловому информационному ресурсу.

    1. Доступ разграничивается только на уровне каталогов. Ограничение доступа к отдельным файлам не проводится.
    2. Назначение прав доступа выполняется на базе групп безопасности. Назначение прав доступа на отдельные учетные записи пользователей не проводится.
    3. Явно запрещающие полномочия доступа (deny permissions) не применяются.
    4. Разграничение прав доступа проводится только на уровне файловой системы. На уровне сетевых протоколов SMB/CIFS права не разграничиваются (Группа «Все» – полномочия «Чтение/Запись» / Everyone – Change).
    5. При настройке сетевого доступа к файловому информационному ресурсу в настройках SMB/CIFS устанавливается опция «Перечисление на основе доступа (Access based enumeration)».
    6. Создание файловых информационных ресурсов на рабочих станциях пользователей недопустимо.
    7. Не рекомендуется размещать файловые информационные ресурсы на системных разделах серверов.
    8. Не рекомендуется создавать несколько точек входа в файловый информационный ресурс.
    9. Следует по возможности избегать создание вложенных файловых информационных ресурсов, а в случаях, когда имена файлов или каталогов содержат конфиденциальную информацию, это вовсе недопустимо

    Доступ пользователей к файловому информационному ресурсу предоставляется путем наделения их одним из вариантов полномочий:

    • Доступ «Только на чтение (Read Only)».
    • Доступ «Чтение и запись (Read & Write)».

    Имена групп доступа пользователей формируются по шаблону:

    FILE-Имя файлового информационного ресурса–аббревиатура полномочий

    Имя файлового информационного ресурса
    должно совпадать с UNC именем ресурса или состоять из имени сервера и локального пути (если сетевой доступ к ресурсу не предоставляется). При необходимости в данном поле допускаются сокращения. Символы «\\» опускаются, а «\» и «:» заменяются на «-».

    Аббревиатуры полномочий:

    • RO — для варианта доступа «Только на чтение (Read Only)»
    • RW — для варианта доступа «Чтение и запись (Read & Write)».

    Пример 2
    Имя группы доступа пользователей, имеющих полномочия «Чтение и запись» для файлового информационного ресурса, размещенного на сервере TERMSRV по пути D:\UsersData, будет:
    FILE-TERMSRV-D-UsersData-RW

    Таблица 1 – Шаблон NTFS-прав доступа для корневого каталога файлового информационного ресурса.

    Субъекты Права Режим наследования
    Наследование прав доступа от вышестоящих каталогов отключено
    А) Обязательные права
    Специальная учетная запись:
    «СИСТЕМА (SYSTEM)»
    Полный доступ (Full access)
    Для этой папки, ее подпапок и файлов (This folder, subfolders and files)
    Локальная группа безопасности:
    «Администраторы (Administrators)»
    Полный доступ (Full access)
    Для этой папки, ее подпапок и файлов (This folder, subfolders and files)
    Б.1) Полномочия «Только чтение (Read Only)»
    Группа доступа пользователей:
    «FILE-Имя ресурса-RO»
    Базовые права:
    а) чтение и выполнение (read & execute);
    б) список содержимого папки (list folder contents);
    в) чтение (read);
    Для этой папки, ее подпапок и файлов (This folder, subfolders and files)
    Б.2) Полномочия «Чтение и запись (Read & Write)»
    Группа доступа пользователей:
    «FILE-Имя ресурса-RW»
    Базовые права:
    а) изменение (modify);
    б) чтение и выполнение (read & execute);
    в) список содержимого папки (list folder contents);
    г) чтение (read);
    д) запись (write);
    Для этой папки, ее подпапок и файлов (This folder, subfolders and files)
    Б.3) Другие полномочия при их наличии
    Группа доступа пользователей:
    «FILE-Имя ресурса-аббревиатура полномочий»
    Согласно полномочиям
    Для этой папки, ее подпапок и файлов (This folder, subfolders and files)

    Табилца 2 – Шаблон NTFS-прав доступа для промежуточных каталогов файлового информационного ресурса.
    Субъекты
    Права
    Режим наследования
    Наследование прав доступа от вышестоящих каталогов включено, но если данный каталог является вышестоящим по отношению к файловым информационным ресурсам и не входит ни в один другой файловый информационный ресурс, то наследование отключено
    А) Обязательные права
    Специальная учетная запись:
    «СИСТЕМА (SYSTEM)»
    Полный доступ (Full access)
    Для этой папки, ее подпапок и файлов (This folder, subfolders and files)
    Локальная группа безопасности:
    «Администраторы»
    Полный доступ (Full access)
    Для этой папки, ее подпапок и файлов (This folder, subfolders and files)
    Б.1) Полномочия «Проход через каталог (TRAVERSE
    Группы доступа пользователей информационных ресурсов, для которых этот каталог является промежуточным
    Дополнительные параметры безопасности:
    а) траверс папок / выполнение файлов (travers folder / execute files);
    б) содержимое папки / чтение данных (list folder / read data);
    в) чтение атрибутов (read attributes);
    в) чтение дополнительных атрибутов (read extended attributes);
    г) чтение разрешений (read permissions);
    Только для этой папки (This folder only)

    1. Создаются группы доступа пользователей. Если сервер, на котором размещен файловый информационный ресурс, является членом домена, то создаются доменные группы. Если нет, то группы создаются локально на сервере.
    2. На корневой каталог и промежуточные каталоги файлового информационного ресурса назначаются права доступа согласно шаблонам прав доступа.
    3. В группы доступа пользователей добавляются учетные записи пользователей в соответствии с их полномочиями.
    4. При необходимости для файлового информационного ресурса создается сетевая папка (shared folder).

    В. Изменение доступа пользователя к файловому информационному ресурсу
    Учетная запись пользователя перемещается в другую группу доступа пользователей в зависимости от указанных полномочий.

    Г. Блокирование доступа пользователя к файловому информационному ресурсу
    Учетная запись пользователя удаляется из групп доступа пользователей файлового информационного ресурса. Если работник увольняется, то членство в группах не меняется, а блокируется учетная запись целиком.

    1. Регистрируется вложенный файловый информационный ресурс (согласно процессу А)
    2. В группы доступа пользователей вложенного файлового информационного ресурса добавляются группы доступа пользователей вышестоящего составного файлового информационного ресурса.
    1. Регистрируется вложенный файловый информационный ресурс (согласно процессу А)
    2. В группы доступа пользователей создаваемого информационного ресурса помещаются те учетные записи пользователей, которым требуется предоставить доступ.
    1. Организационными (или техническими, но не связанными с изменением прав доступа к каталогам файловой системы) мерами блокируется доступ пользователей к данному и всем вложенным файловым информационным ресурсам.
    2. К корневому каталогу файлового информационного ресурса назначаются новые права доступа, при этом заменяются права доступа для всех дочерних объектов (активируется наследие).
    3. Перенастраиваются права доступа для всех вложенных информационных ресурсов.
    4. Настраиваются промежуточные каталоги для данного и вложенных информационных ресурсов.

    Рассмотрим применение данного стандарта на примере гипотетической организации ООО «ИнфоКриптоСервис», где для централизованного хранения файловых информационных ресурсов выделен сервер с именем «FILESRV». Сервер работает под управлением операционной системы Microsoft Windows Server 2008 R2 и является членом домена Active Directory с FQDN именем «domain.ics» и NetBIOS именем «ICS».

    Подготовка файлового сервера
    На диске «D:» сервера «FILESRV» создаем каталог «D:\SHARE\». Этот каталог будет единой точкой входа во все файловые информационные ресурсы, размещенные на данном сервере. Организуем сетевой доступ к данной папке (используем апплет «Share and Storage Management»):




    Создание файлового информационного ресурса
    Постановка задачи.
    Пусть в составе организации ООО «ИнфоКриптоСервис» имеется Отдел разработки информационных систем в составе: начальника отдела Иванова Сергея Леонидовича (SL.Ivanov@domain.ics), специалиста Маркина Льва Борисовича (LB.Markin@domain.ics), и для них нужно организовать файловый информационный ресурс для хранения данных подразделения. Обоим работникам требуется доступ на чтение и запись к данному ресурсу.

    • «FILE-FILESRV-SHARE-Отд. разр. ИС-RO»
    • «FILE-FILESRV-SHARE-Отд. разр. ИС-RW»

    Предоставление доступа пользователю к файловому информационному ресурсу
    Постановка задачи.
    Предположим, в отдел разработки приняли еще одного работника – специалиста Егорова Михаила Владимировича (MB.Egorov@domain.ics), и ему, как и остальным работникам отдела, требуется доступ на чтение и запись к файловому информационному ресурсу отдела.

    Решение.
    Учетную запись работника необходимо добавить в группу «FILE-FILESRV-SHARE-Отд. разр. ИС-RW»

    Создание вложенного информационного ресурса. Расширение доступа
    Постановка задачи.
    Предположим, Отдел разработки информационных систем решил улучшить качество взаимодействия с Отделом маркетинга и предоставить руководителю последнего — Кругликовой Наталье Евгеньевне (NE.Kruglikova@domain.ics) — доступ на чтение к актуальной документации на продукты, хранящейся в папке «Документация» файлового информационного ресурса Отдела разработки информационных систем.

    Решение.
    Для решения данной задачи необходимо сделать вложенный ресурс «\\FILESRV\share\Отдел разработки информационных систем\Документация», доступ к которому на чтение и запись должен быть (остаться) у всех пользователей, имевших доступ к «\\FILESRV\share\Отдел разработки информационных систем\ и добавиться доступ на чтение для пользователя Кругликовой Натальи Евгеньевне (NE.Kruglikova@domain.ics)

    • «FILE-FILESRV-SHARE-Отд. разр. ИС-Документация-RO»
    • «FILE-FILESRV-SHARE-Отд. разр. ИС-Документация-RW»

    Теперь, если Кругликова Наталья Евгеньевна (NE.Kruglikova@domain.ics) обратится по ссылке «\\FILESRV\share\Отдел разработки информационных систем\Документация», то она сможет попасть в интересующую ее папку, но обращаться по полному пути не всегда удобно, поэтому настроим сквозной проход к данной паке от точки входа «\\FILESRV\share\» («D:\SHARE\»). Для этого настроим права доступа на промежуточные каталоги «D:\SHARE\» и «D:\SHARE\Отдел разработки информационных систем\».

    Проведем настройку «D:\SHARE\»:

    Дамп NTFS разрешений, полученных командой cacls:
    ICS\FILE-FILESRV-SHARE-Отд. разр. ИС-RO:R
    ICS\FILE-FILESRV-SHARE-Отд. разр. ИС-RW:R
    ICS\FILE-FILESRV-SHARE-Отд. разр. ИС-Документация-RO:R
    ICS\FILE-FILESRV-SHARE-Отд. разр. ИС-Документация-RW:R
    NT AUTHORITY\SYSTEM:(OI)(CI)F
    BUILTIN\Administrators:(OI)(CI)F

    и «D:\SHARE\Отдел разработки информационных систем»:

    Дамп NTFS разрешений, полученных командой cacls:
    ICS\FILE-FILESRV-SHARE-Отд. разр. ИС-Документация-RO:R
    ICS\FILE-FILESRV-SHARE-Отд. разр. ИС-Документация-RW:R
    ICS\FILE-FILESRV-SHARE-Отд. разр. ИС-RO:(OI)(CI)R
    ICS\FILE-FILESRV-SHARE-Отд. разр. ИС-RW:(OI)(CI)C
    NT AUTHORITY\SYSTEM:(OI)(CI)F
    BUILTIN\Administrators:(OI)(CI)F

    Создание вложенного информационного ресурса. Сужение доступа
    Постановка задачи
    В целях организации резервного копирования наработок Отдела разработки информационных систем начальнику отдела Иванову Сергею Леонидовичу (SL.Ivanov@domain.ics), в рамках файлового информационного ресурса отдела, понадобилась сетевая папка «Архив», доступ к которой был бы только у него.

    Решение.
    Для решения данной задачи в файловом информационном ресурсе отдела требуется сделать вложенный ресурс «Архив» («\\FILESRV\share\Отдел разработки информационных систем\Архив»), доступ к которому предоставить только начальнику отдела.

    Существенной особенностью всех рассмотренных до сих пор значений производных типов является наличие в них конечного, наперед заданного числа компонент. Так, в значении многомерного массива это число можно определить, зная количество компонент по каждому измерению, а в значении записи это число определяется количеством и типом полей. Таким образом, заранее, еще до выполнения программы, по этому описанию можно выделить необходимый объем памяти машины для хранения значений переменных этих типов. Но существует определенный класс задач и определенные ситуации, когда количество компонент (пусть даже одного и того же из известных уже типов) заранее определить невозможно, оно выясняется только в процессе решения задачи. Поэтому возникает необходимость в специальном типе значений, которые представляют собой произвольные последовательности элементов одного и того же типа, причем длина этих последовательностей заранее не определяется, а конкретизируется в процессе выполнения программы. Этот тип значений получил название файлового типа. Условно файл в Паскале можно изобразить как некоторую ленту, у которой есть начало, а конец не фиксируется. Элементы файла записываются на эту ленту последовательно друг за другом:

    файл Паскаля (Pascal)

    где F – имя файла, а F1, F2, F3, F4 – его элементы. Файл во многом напоминает магнитную ленту, начало которой заполнено записями, а конец пока свободен. В программировании существует несколько разновидностей файлов, отличающихся методом доступа к его компонентам:файлы последовательного доступа и файлы произвольного доступа.

    Простейший метод доступа состоит в том, что по файлу можно двигаться только последовательно, начиная с первого его элемента, и, кроме этого, всегда существует возможность начать просмотр файла с его начала. Таким образом, чтобы добраться до пятого элемента файла, необходимо, начав с первого элемента, пройти через предыдущие четыре. Такие файлы называют файлами последовательного доступа. У последовательного файла доступен всегда лишь очередной элемент. Если в процессе решения задачи необходим какой-либо из предыдущих элементов, то необходимо вернуться в начало файла и последовательно пройти все его элементы до нужного.

    Файлы произвольного доступа Паскаля позволяют вызывать компоненты в любом порядке по их номеру.

    Важной особенностью файлов является то, что данные, содержащиеся в файле, переносятся на внешние носители. Файловый тип Паскаля – это единственный тип значений, посредством которого данные, обрабатываемые программой, могут быть получены извне, а результаты могут быть переданы во внешний мир. Это единственный тип значений, который связывает программу с внешними устройствами ЭВМ.

    Работа с файлами в Паскале

    Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип Паскаля, кроме файлов. Иными словами, нельзя создать «файл файлов». В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

    Файловый тип или переменную файлового типа в Паскале можно задать одним из трех способов:

    Здесь <имя_ф_типа> – имя файлового типа (правильный идентификатор); File, of – зарезервированные слова (файл, из); <тип_элементов> – любой тип Паскаля, кроме файлов.

    Пример описания файлового типа в Паскале

    Type
    Product= record
    Name: string;
    Code: word;
    End;
    Text80= file of string[80];
    Var
    F1: file of char;
    F2: text;
    F3: file;
    F4: Text80;
    F5: file of Product;

    В зависимости от способа объявления можно выделить три вида файлов Паскаля:

    • типизированные файлы Паскаля(задаются предложением file of..);
    • текстовые файлы Паскаля(определяются типом text);
    • нетипизированные файлы Паскаля(определяются типом file).

    Следует помнить, что физические файлы на магнитных дисках и переменные файлового типа в программе на Паскале – объекты различные. Переменные файлового типа в Паскале могут соответствовать не только физическим файлам, но и логическим устройствам, связанным с вводом/выводом информации. Например, клавиатуре и экрану соответствуют файлы со стандартными именами Input, Output.

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

    Переменные файлового типа используются в программе только в качестве параметров собственных и стандартных процедур и функций.

    Основные процедуры и функции для работы с файлами

    1.До начала работы с файлами в Паскале необходимо установить связь между файловой переменной и именем физического дискового файла:

    Следует помнить, что имя дискового файла при необходимости должно содержать путь доступа к этому файлу, включая имя дисковода. При этом имя дискового файла – строковая величина, т.е. должна быть заключена в апострофы. Например:

    Пример процедуры Assign в Паскале

    Если путь не указан, то программа будет искать файл в своем рабочем каталоге и по указанным путям в autoexec.bat.

    Вместо имени дискового файла можно указать имя логического устройства, каждое из которых имеет стандартное имя:

    CON – консоль, т.е. клавиатура-дисплей;

    PRN – принтер. Если к компьютеру подключено несколько принтеров, доступ к ним осуществляется по именам LPT1, LPT2, LPT3.

    Не разрешается связывать с одним физическим файлом более одной файловой переменной.

    2.После окончания работы с файлами на Паскале, они должны быть закрыты.

    При выполнении этой процедуры закрываются соответствующие физические файлы и фиксируются сделанные изменения. Следует иметь в виду, что при выполнении процедуры close связь файловой переменной с именем дискового файла, установленная ранее процедурой assign, сохраняется, следовательно, файл можно повторно открыть без дополнительного использования процедуры assign.

    Работа с файлами заключается, в основном, в записи элементов в файл и считывании их из файла. Для удобства описания этих процедур введем понятие указателя, который определяет позицию доступа, т.е. ту позицию файла, которая доступна для чтения (в режиме чтения), либо для записи (в режиме записи). Позиция файла, следующая за последней компонентой файла (или первая позиция пустого файла) помечается специальным маркером, который отличается от любых компонент файла. Благодаря этому маркеру определяется конец файла.

    3.Подготовка к записи в файл Паскаля

    Процедура Rewrite(f) (где f – имя файловой переменной) устанавливает файл с именем f в начальное состояние режима записи, в результате чего указатель устанавливается на первую позицию файла. Если ранее в этот файл были записаны какие-либо элементы, то они становятся недоступными. Результат выполнения процедуры rewrite(f); выглядит следующим образом:

    файл Паскаля (Pascal)

    4.Запись в файл Паскаля

    При выполнении процедуры write(f, x) в ту позицию, на которую показывает указатель, записывается очередная компонента, после чего указатель смещается на следующую позицию. Естественно, тип выражения х должен совпадать с типом компонент файла. Результат действия процедуры write(f, x) можно изобразить так:

    Состояние файла f до выполнения процедуры

    файл Паскаля (Pascal)

    Состояние файла f после выполнения процедуры

    файл Паскаля (Pascal)

    Для типизированных файлов выполняется следующее утверждение: если в списке записи перечислено несколько выражений, то они записываются в файл, начиная с первой доступной позиции, а указатель смещается на число позиций, равное числу записываемых выражений.

    5.Подготовка файла к чтению Паскаля

    Эта процедура ищет на диске уже существующий файл и переводит его в режим чтения, устанавливая указатель на первую позицию файла. Результат выполнения этой процедуры можно изобразить следующим образом:

    файл Паскаля (Pascal)

    Если происходит попытка открыть для чтения не существующий еще на диске файл, то возникает ошибка ввода/вывода, и выполнение программы будет прервано.

    6.Чтение из файла в Паскале

    Рассмотрим результат действия процедуры read(f, v):

    Состояние файла f и переменной v до выполнения процедуры:

    файл Паскаля (Pascal)

    Состояние файла f и переменной v после выполнения процедуры:

    файл Паскаля (Pascal)

    Для типизированных файлов при выполнении процедуры read() последовательно считывается, начиная с текущей позиции указателя, число компонент файла, соответствующее числу переменных в списке, а указатель смещается на это число позиций.

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

    7.Функция определения достижения конца файла в Паскале

    Название этой функции является сложносокращенным словом от end of file. Значение этой функции имеет значение true, если конец файла уже достигнут, т.е. указатель стоит на позиции, следующей за последней компонентой файла. В противном случае значение функции – false.

    8.Изменение имени файла в Паскале

    Здесь новое_ имя_ файла – строковое выражение, содержащее новое имя файла, возможно с указанием пути доступа к нему.

    Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.

    9.Уничтожение файла в Паскале

    Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.

    10.Уничтожение части файла от текущей позиции указателя до конца в Паскале

    11.Файл Паскаля может быть открыт для добавления записей в конец файла

    Типизированные файлы Паскаля. Длина любого компонента типизированного файла строго постоянна, т.к. тип компонент определяется при описании, а, следовательно, определяется объем памяти, отводимый под каждую компоненту. Это дает возможность организовать прямой доступ к каждой компоненте (т.е. доступ по порядковому номеру).

    Перед первым обращением к процедурам ввода/вывода указатель файла стоит в его начале и указывает на его первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные и выражения в списках ввода и вывода в процедурах read() и write() должны иметь тот же тип, что и компоненты файла Паскаля. Если этих переменных или выражений в списке несколько, то указатель будет смещаться после каждой операции обмена данными на соответствующее число позиций.

    Для облегчения перемещения указателя по файлу и доступа к компонентам типизированного файла существуют специальные процедуры и функции:

    fileSize(<имя_ф_переменной>) – функция Паскаля, определяющая число компонентов в файле;

    filePos(<имя_ф_переменной>) – функция Паскаля, значением которой является текущая позиция указателя;

    seek(<имя_ф_переменной>,n) – процедура Паскаля, смещающая указатель на компоненту файла с номером n. Так, процедура seek(<имя_ф_переменной>,0) установит указатель в начало файла, а процедура seek(<имя_ф_переменной>, FileSize(<имя_ф_переменной>)) установит указатель на признак конца файла.

    Текстовые файлы Паскаля. Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. Процедуры и функции seek, filepos, filesize к ним не применяются. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line – конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN(<имя_ф_переменной>), которая принимает значение true, если конец строки достигнут.

    Форма обращения к процедурам write и read для текстовых и типизированных файлов одинакова, но их использование принципиально различается.

    В списке записываемых в текстовый файл элементов могут чередоваться в произвольном порядке числовые, символьные, строковые выражения. При этом строковые и символьные элементы записываются непосредственно, а числовые из машинной формы автоматически преобразуются в строку символов.

    • текстовые файлы удобнее для восприятия человеком, а типизированные соответствуют машинному представлению объектов;
    • текстовые файлы, как правило, длиннее типизированных;
    • длина текстовых файлов зависит не только от количества записей, но и от величины переменных.

    Но, вообще-то, такой файл не понимает не только машина, а и человек.

    Чтобы избежать этой ошибки, достаточно вставить при записи в файл после каждой переменной пробел. Тогда программа при каждом чтении берет символы от пробела до пробела и правильно преобразует текстовое представление в число.

    Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.

    Пример решения задачи с файлами Паскаля

    Пусть нам необходимо сформировать текстовый файл с помощью Паскаля, а затем переписать из данного файла во второй только те строки, которые начинаются с буквы «А» или «а».

    Пояснения: нам понадобятся две файловые переменные f1 и f2, поскольку оба файла текстовые, то тип переменных будет text. Задача разбивается на два этапа: первый – формирование первого файла; второй – чтение первого файла и формирование второго.

    Для завершенности решения задачи есть смысл добавить еще одну часть, которая в задаче явно не указана – вывод на экран содержимого второго файла.

    Читайте также: