Что не является файловой системой. Файловые системы. Типы файловых систем. Операции с файлами. Каталоги. Операции с каталогами. (5)

Что не является файловой системой. Файловые системы. Типы файловых систем. Операции с файлами. Каталоги. Операции с каталогами. (5)

11.07.2019

Материал к обзорной лекции № 33

для студентов специальности

«Программное обеспечение информационных технологий»

доцента кафедры ИВТ, к.т.н. Ливак Е.Н.

СИСТЕМЫ УПРАВЛЕНИЯ ФАЙЛАМИ

Основные понятия, факты

Назначение. Особенности файловыхсистем FAT , VFAT , FAT 32, HPFS , NTFS . Файловые системы ОС UNIX (s5, ufs), ОС Linux Ext2FS.Системные области диска (раздела, тома). Принципы размещения файлов и хранения информации о расположении файлов. Организация каталогов. Ограничение доступа к файлам и каталогам.

Навыки и умения

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

Файловые системы. Структура файловой системы

Данные на диске хранятся в виде файлов. Файл - это именованная часть диска.

Для управления файлами предназначены системы управления файлами.

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

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

Система управления файлами является основной подсистемой в абсолютном большинстве современных ОС.

С помощью системы управления файлами

· связываются по данным все системные обрабатывающие программы;

· решаются проблемы централизованного распределения дискового пространства и управления данными;

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

В некоторых ОС может быть несколько систем управления файлами, что обеспечивает им возможность работать с несколькими файловыми системами.

Постараемся различать файловую систему и систему управления файлами.

Термин «файловая система» определяет принципы доступа к данным, организованным в файлы.

Термин «система управления файлами» относится к конкретной реализации файловой системы, т.е. это комплекс программных модулей, обеспечивающих работу с файлами в конкретной ОС.

Итак, для работы с файлами, организованными в соответствии с некоторой файловой системой, для каждой ОС должна быть разработана соответствующая система управления файлами. Эта система УФ будет работать только в той ОС, для которой она создана.

Для семейства ОС Windows в основном используются файловые системы: VFAT , FAT 32, NTFS .

Рассмотрим структуру этих файловых систем.

В файловой системе FAT дисковое пространство любого логического диска делится на две области:

· системную область и

· область данных.

Системная область создается и инициализируется при форматировании, а впоследствии обновляется при манипулировании файловой структурой.

Системная область состоит из следующих компонентов:

· загрузочного сектора, содержащего загрузочную запись (boot record );

· зарезервированных секторов (их может и не быть);

· таблицыразмещенияфайлов (FAT, File Allocation Table);

· корневогокаталога (Root directory, ROOT).

Эти компоненты расположены на диске друг за другом.

Область данных содержит файлы и каталоги, подчиненные корневому.

Область данных разбивают на так называемые кластеры. Кластер - это один или несколько смежных секторов области данных. С другой стороны, кластер - это минимальная адресуемая единица дисковой памяти, выделяемая файлу. Т.е. файл или каталог занимает целое число кластеров. Для создания и записи на диск нового файла операционная системаотводит для него несколько свободных кластеров диска. Эти кластеры не обязательно должны следовать друг за другом. Для каждого файла хранится список всех номеров кластеров, которые предоставлены данному файлу.

Разбиение области данных на кластеры вместо использования секторов позволяет:

· уменьшить размер таблицы FAT ;

· уменьшить фрагментацию файлов;

· сокращается длина цепочек файла Þ ускоряется доступ к файлу.

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

В современных файловых системах (FAT 32, HPFS , NTFS ) эта проблема решается за счет ограничения размера кластера (максимум 4 Кбайта)

Картой области данных являетсяТ аблица размещения файлов (File Allocation Table - FAT) Каждый элемент таблицы FAT (12, 16 или 32 бит) соответствует одному кластеру диска и характеризует его состояние: свободен, занят или является сбойным кластером (bad cluster).

· Если кластер распределен какому-либо файлу (т.е., занят), то соответствующий элемент FAT содержит номер следующего кластера файла;

· последний кластер файла отмечается числом в диапазоне FF8h - FFFh (FFF8h - FFFFh);

· если кластер является свободным, он содержит нулевое значение 000h (0000h);

· кластер, непригодный для использования (сбойный), отмечается числом FF7h (FFF7h).

Таким образом, в таблице FAT кластеры, принадлежащие одному файлу, связываются в цепочки.

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

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

В связи с тем, что FAT используется очень интенсивно при доступе к диску, она обычно загружается в ОП (в буфера ввода/вывода или кэш) и остается там настолько долго, насколько это возможно.

Основной недостаток FAT - медленная работа с файлами. При создании файла работает правило - выделяется первый свободный кластер. Это ведет к фрагментации диска и сложным цепочкам файлов. Отсюда следует замедление работы с файлами.

Для просмотра и редактирования таблицы FAT можно использовать утилиту Disk Editor .

Подробнаяинформация о самом файле хранится в другой структуре, которая называется корневым каталогом. Каждый логический диск имеет свой корневой каталог (ROOT, англ. - корень).

Корневой каталог описываетфайлы и другие каталоги. Элементом каталога является дескриптор (описатель) файла.

Дескриптор каждого файла и каталога включает его

· имя

· расширение

· дату создания или последней модификации

· время создания или последней модификации

· атрибуты (архивный, атрибут каталога, атрибут тома, системный, скрытый, только для чтения)

· длину файла (для каталога - 0)

· зарезервированное поле, которое не используется

· номер первого кластера в цепочке кластеров, отведенных файлу или каталогу; получив этот номер, операционная система, обращаясь к таблице FAT, узнает и все остальные номера кластеров файла.

Итак, пользователь запускает файл на выполнение. Операционная система ищет файл с нужным именем, просматривая описания файлов в текущем каталоге. Когда найден требуемый элемент в текущем каталоге, операционная система считывает номер первого кластера данного файла, а затем по таблице FAT определяет остальные номера кластеров. Данные из этих кластеров считываются в оперативную память, объединяясь в один непрерывный участок. Операционная система передает управление файлу, и программа начинает работать.

Для просмотра и редактирования корневого каталога ROOT можно также использовать утилиту Disk Editor .

Файловая система VFAT

Файловая система VFAT (виртуальная FAT ) впервые появилась в Windows for Workgroups 3.11 и была предназначена для файлового ввода/вывода в защищенном режиме.

Используется эта файловая система в Windows 95.

Поддерживается она также и в Windows NT 4.

VFAT - это «родная» 32-разрядная файловая система Windows 95. Ее контролирует драйвер VFAT .VXD .

VFAT использует 32-разрядный код для всех файловых операций, может использовать 32-разрядные драйверы защищенного режима.

НО, элементы таблицы размещения файлов остаются 12- или 16-разрядными, поэтому на диске используется та же структура данных (FAT ). Т.е. формат таблицы VFAT такой же , как и формат FAT .

VFAT наряду с именами «8.3» поддерживает длинные имена файлов . (Часто говорят, что VFAT - это FAT с поддержкой длинных имен).

Основной недостаток VFAT - большие потери на кластеризацию при больших размерах логического диска и ограничения на сам размер логического диска.

Файловая система FAT 32

Это новая реализация идеи использования таблицы FAT .

FAT 32 - это полностью самостоятельная 32-разрядная файловая система.

Впервые использовалась в Windows OSR 2 (OEM Service Release 2).

В настоящее время FAT 32 используется в Windows 98 и Windows ME .

Она содержит многочисленные усовершенствования и дополнения по сравнению с предыдущими реализациями FAT .

1. Намного эффективнее расходует дисковое пространство за счет того, что использует кластеры меньшего размера (4 Кб) - подсчитано, что экономится до 15%.

2. Имеет расширенную загрузочную запись, которая позволяет создавать копии критических структур данных Þ повышает устойчивость диска к нарушениям структур диска

3. Может использовать резервную копию FAT вместо стандартной.

4. Может перемещать корневой каталог, другими словами, корневой каталог может находиться в произвольном месте Þ снимает ограничение на размер корневого каталога (512 элементов, т.к. ROOT должен был занимать один кластер).

5. Усовершенствована структура корневого каталога

Появились дополнительные поля, например, время создания, дата создания, дата последнего доступа, контрольная сумма

По-прежнему для длинного имени файла используется несколько дескрипторов.

Файловая система HPFS

HPFS (High Performance File System ) - вы­сокопроизводительная файловая система.

HPFS впервые появилась в OS/2 1.2 и LAN Manager .

Перечислим основные особенности HPFS.

· Главное отличие - базовые принципы размещения файлов на диске и принципы хранения информации о местоположении файлов. Благодаря этим принципам HPFS имеет высокую производительность и отказоустойчивость, является надежной файловой системой.

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

· Система HPFS стремится расположить файл в смежных блоках, или, если такой возможности нет, разместить его на диске таким образом, чтобы экстенты (фрагменты) файла физически были как можно ближе друг к другу. Такой подход существенно уменьшает время позиционирова­ния головок записи/чтения жесткого диска и время ожидания (задержка между установкой головки чтения/записи на нужную дорожку). Напомним, что в FAT файлу просто выделяется первый свободный кластер.

Экстенты (extent ) - фрагменты файла, располагающиеся в смежных секторах диска. Файл имеет по крайней мере один экстент, если он не фрагментирован, а в противномслучае - несколько экстентов.

· Используется метод сбалансированных двоичных деревьев для хранения и поиска ин­формации о местонахождении файлов (каталоги хранятся в центре диска, кроме того, предусмотрена автоматиче­ская сортировка каталогов), что существенно повышает производительность HPFS (в сравнении с FAT ).

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

Расширенные атрибуты (extended attributes , EAs ) позволяют хранить дополнительную информацию о файле. Например, каждому файлу может быть сопоставлено его уникаль­ное графическое изображение (значок), описание файла, коммента­рий, сведения о владельце файла и т. д.

C труктура раздела HPFS


В начале раздела с установленной HPFS расположено три управляющих блока:

· загрузочный блок (boot block ),

· дополнительный блок (super block ) и

· запас­ной (резервный) блок (spare block ).

Они занимают 18 секторов.

Все остальное дис­ковое пространство в HPFS разбито на части из смежных секторов - полосы (band - полоса, лента). Каждая полоса занимает на диске 8 Мбайт.

Каждая полоса и имеет свою собственную битовую карту распределе­ния секторов .Битовая карта показывает, какие секторы данной полосы за­няты, а какие - свободны. Каждому сектору полосы данных соответствует один бит в ее битовой карте. Если бит = 1, то сектор занят, если 0 - свободен.

Битовые карты двух полос располагаются на диске рядом, так же располагаются и сами полосы. То есть последовательность полос и карт выглядит как на рис.

Сравним с FAT . Там на весь диск только одна «битовая карта» (таблица FAT ). И для работы с ней приходится перемещать головки чте­ния/записи в среднем через половину диска.

Именно для того, чтобы сократить время позиционирования головок чтения/записи жесткого диска, в HPFS диск разбит на полосы.

Рассмотрим управляющие блоки .

Загрузочный блок (boot block )

Содержит имя тома, его серийный номер, блок парамет­ров BIOS и программу начальной загрузки.

Программа начальной загрузки на­ходит файл OS 2 LDR , считывает его в память и передает управление этой про­грамме загрузки ОС, которая, в свою очередь, загружает с диска в память ядро OS/2 - OS 2 KRNL . И уже OS 2 KRIML с помощью сведений из файла CONFIG . SYS за­гружает в память все остальные необходимые программные модули и блоки дан­ных.

Загрузочный блок располагается в секторах с 0 по 15.

Супер Блок (super block )

Содержит

· указатель на список битовых карт (bitmap block list ). В этом списке перечислены все блоки на диске, в которых расположены би­товые карты, используемые для обнаружения свободных секторов;

· указатель на список дефектных блоков (bad block list ). Когда система обнаруживает поврежденный блок, он вносится в этот список и для хранения информации больше не используется;

· указатель на группу каталогов (directory band ),

· указатель на файловый узел (F -node ) корневого каталога,

· дату последней проверки раздела програм­мой CHKDSK ;

· информацию о размере полосы (в текущей реализации HPFS - 8 Мбайт).

Super block размещается в 16 секторе.

Резервный блок (spare block)

Содержит

· указатель на карту аварийного замеще­ния (hotfix map или hotfix -areas );

· указатель на список свободных запасных бло­ков (directory emergency free block list );

· ряд системных флагов и дескрипторов.

Этот блок разме­щается в 17 секторе диска.

Резервный блок обеспечивает высокую отказоустойчивость файловой системы HPFS и позволяет восстанавливать поврежденные данные на диске.

Принцип размещения файлов

Экстенты (extent ) - фрагменты файла, располагающиеся в смежных секторах диска. Файл имеет по крайней мере один экстент, если он не фрагментирован, а в противномслучае - несколько экстентов.

Для сокращения времени позиционирования головок чтения/записи жесткого диска система HPFS стремится

1)расположить файл в смежных блоках;

2)если такой возможности нет, то разместить экстенты фрагментированного файла как можно ближе друг к другу,

Для этого HPFS использует статистику, а также старается условно резервировать хотя бы 4 килобайта места в конце файлов, которые растут.

Принципы хранения информации о расположении файлов

Каждый файл и каталог диска имеет свой файловый узел F-Node . Это структура, в которой содержится информация о располо­жении файла и о его расширенных атрибутах.

Каждый F-Node занимает один сектор и всегда располагается поблизости от своего файла или каталога (обычно - непосредственно перед файлом или ка­талогом). Объект F-Node содержит

· длину,

· первые 15 символов имени файла,

· специальную служебную информацию,

· статистику по доступу к файлу,

· расши­ренные атрибуты файла,

· список прав доступа (или только часть этого списка, если он очень большой); если расширен­ные атрибуты слишком велики для файлового узла, то в него записывается ука­затель на них.

· ассоциативную информацию о расположении и подчине­нии файла и т. д.

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

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

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

Структура и размещение каталогов

Для хранения каталогов используется полоса, находящаяся в центре диска .

Эта полоса называетсяdirectory band .

Если она полностью заполнена, HPFS начинает располагать каталоги файлов в других полосах.

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

Однако существенно больший (по сравнению с размещением Directory Band в середине логического диска) вклад в производительность HPFS дает использо­вание метода сбалансированных двоичных деревьев для хранения и поиска ин­формации о местонахождении файлов.

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

В HPFS структура каталога представляет собой сбалансированное де­рево с записями, расположенными в алфавитном порядке.

Каждая за­пись, входящая в состав дерева, содержит

· атрибуты файла,

· указатель на соответствующий файловый узел,

· информацию о времени и дате создания фай­ла, времени и дате последнего обновления и обращения,

· длине данных, содержа­щих расширенные атрибуты,

· счетчик обращений к файлу,

· длине имени файла

· само имя,

· и другую информацию.

Файловая система HPFS при поиске файла в каталоге просматривает только не­обходимые ветви двоичного дерева. Такой метод во много раз эффек­тивнее, чем последовательное чтение всех записей в каталоге, что имеет место в системе FAT .

Размер каждого из блоков, в терминах которых выделяются каталоги в текущей реализации HPFS, равен 2 Кбайт. Размер записи, описывающей файл, зависит от размера имени файла. Если имя занимает 13 байтов (для формата 8.3), то блок из 2 Кбайт вмещает до 40 описателей файлов. Блоки связаны друг с другом по­средством списка.

Проблемы

При переименовании файлов может возникнуть так называемая перебаланси­ровка дерева. Создание файла, переименование или стирание может приводить к каскадированию блоков каталогов . Фактически, переименование может потер­петь неудачу из-за недостатка дискового пространства, даже если файл непо­средственно в размерах не увеличился. Во избежание этого «бедствия» HPFS поддерживает небольшой пул свободных блоков, которые могут использовать­ся при «аварии». Эта операция может потребовать выделения дополнительных блоков на заполненном диске. Указатель на этот пул свободных блоков сохраня­ется в SpareBlock ,

Принципы размещения файлов и каталогов на диске в HPFS :

· информация о местоположении файлов рассредоточена по всему дис­ку, при этом записи каждого конкретного файла размещаются (по возможно­сти) в смежных секторах и поблизости от данных об их местоположении;

· каталоги размещаются в середине дискового пространства;

· каталоги хранятся в виде бинарного сбалансированного дерева с записями, расположенными в алфавитном порядке.

Надежность хранения данных в HPFS

Любая файловая система должна обладать средствами исправления ошибок, возникаю­щих при записи информации на диск. Система HPFS для этого использует меха­низм аварийного замещения ( hotfix ).

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

Эта карта представляет собой просто пары двойных слов, каждое из которых является 32-битным номером сектора.

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

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

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

Файловая система NTFS

Файловая система NTFS (New Technology File System) содержит ряд значительных усовер­шенствований и изменений, существенно отличающих ее от других файловых систем.

Заметим, что за редкими исключениями, с разделами NTFS можно работать напрямую только из Windows NT , хотя и имеются для ряда ОС соответствующие реализа­ции систем управления файлами для чтения файлов из томов NTFS.

Однако полноценных реализаций для работы с NTFS вне системы Windows NT пока нет.

NTFS не поддерживается в широко распространенных ОС Windows 98 и Windows Millennium Edition .

Основные особенности NT FS

· работа на дисках большого объема происходит эффективно (намного эффективнее, чем в FAT );

· имеются средства для ограничения доступа к файлам и катало­гам Þ раз­делы NTFS обеспечивают локальную безопасность как файлов, так и каталогов;

· введен механизм транзакций, при котором осуществляется журналирование файловых операций Þ существенное увеличение надежности;

· сняты многие ограничения на максимальное количество дисковых секто­ров и/или кластеров;

· имя файла в NTFS, в отличие от файловых систем FAT и HPFS , может содержать любые символы, включая полный набор национальных алфавитов, так как данные представлены в Unicode - 16-битном представлении, которое дает 65535 разных символов. Максимальная длина имени файла в NTFS - 255 символов.

· система NTFS также об­ладает встроенными средствами сжатия, которые можно применять к отдельным файлам, целым каталогам и даже томам (и впоследствии отменять или назначать их по своему усмотрению).

Структура тома с файловой системой NTFS

Раздел NTFS называется томом (volume ). Максимально возможные размеры тома (и размеры файла) составляют 16 Эбайт (экзабайт 2**64).

Как и другие системы, NTFS делит дисковое пространство тома на кластеры - блоки данных, адресуемые как единицы данных. NTFS поддержива­ет размеры кластеров от 512 байт до 64 Кбайт; стандартом же считается кластер размером 2 или 4 Кбайт.

Все дисковое пространство в NTFS делится на две неравные части.


Первые 12 % диска отводятся под так называемую MFT-зону - пространство, которое может занимать, увеличиваясь в размере, главный служебный метафайл MFT .

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

Остальные 88 % тома представляют собой обычное пространство для хранения файлов.

MFT (master file table - общая таблица файлов) по сути - это каталог всех остальных файлов диска, в том числе и себя самого. Он предназначен для определения расположения файлов.

MFT состоит из записей фиксированного размера. Размер записи MFT (минимум 1 Кб и максимум 4 Кб) оп­ределяется во время форматирования тома.

Каждая запись соответ­ствует какому-либо файлу.

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

Эти первые 16 эле­ментов MFT - единственная часть диска, имеющая строго фиксированное поло­жение. Копия этих же 16 записей хранится в середине тома для надежности.

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

Метафайлы носят служебный характер - каждый из них отвечает за какой-либо аспект работы системы. Метафайлы нахо­дятся в корневом каталоге NTFS-тома. Все они начинаются с символа имени «$», хотя получить какую-либо информацию о них стандартными средствами сложно. В табл. приведены основные метафайлы и их назначение.

Имя метафайла

Назначение метафайла

$MFT

Сам Master File Table

$MFTmirr

Копия первых 16 записей MFT, размещенная посередине тома

$LogFile

Файл поддержки операций журналирования

$Volume

Служебная информация - метка тома, версия файловой системы и т. д.

$AttrDef

Список стандартных атрибутов файлов на томе

Корневой каталог

$Bitmap

Карта свободного места тома

$Boot

Загрузочный сектор (если раздел загрузочный)

$Quota

Файл, в котором записаны права пользователей на использование дискового пространства (этот файл начал работать лишь в Windows 2000 с системой NTFS 5.0)

$Upcase

Файл - таблица соответствия заглавных и прописных букв в именах файлов. В NTFS имена файлов записываются в Unicode (что составляет 65 тысяч различных символов) и искать большие и малые эквиваленты в данном случае - нетривиальная задача

В соответствующей записи MFT хранится вся информация о файле:

· имя файла,

· размер;

· атрибуты файла;

· положение на диске отдельных фрагментов и т. д.

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

Если файл имеет не очень большой размер, то данные файла хранятся прямо в MFT, в оставшемся от основных данных месте в пределах одной записи MFT.

Файл в томе с NTFS идентифицируется так называемой файловой ссылкой (File Reference ), которая представляется как 64-разрядное число.

· номера файла, который соответствует номеру записи в MFT,

· и номера последовательности. Этот номер увеличивается всякий раз, когда данный номер в MFT используется повторно, что позволяет файловой системе NTFS выполнять внутренние проверки целостности.

Каждый файл в NTFS представлен с помощью потоков (streams ), то есть у него нет как таковых «просто данных», а есть потоки.

Один из потоков - это и есть данные файла.

Большинство атрибутов файла - это тоже потоки.

Таким об­разом, получается, что базовая сущность у файла только одна - номер в MFT, а все остальное, включая и его потоки, - опционально.

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

Стандартные атрибуты для файлов и каталогов в томе NTFS имеют фиксиро­ванные имена и коды типа.

Каталог в NTFS представляет собой специальный файл, хранящий ссылки на другие файлы и каталоги.

Файл каталога разделен на блоки, каждый из которых содержит

· имя файла,

· базовые атрибуты и

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

Внутренняя структура каталога представляет собой бинарное дерево, как в HPFS.

Количество файлов в корневом и некорневом каталогах не ограни­чено.

Файловая система NTFS поддерживает объектную модель безопасности NT : NTFS рассматривает каталоги и файлы как разнотипные объекты и ведет отдельные (хотя и перекры­вающиеся) списки прав доступа для каждого типа.

NTFS обеспечивает безопасность на уровне файлов; это означает, что права доступа к томам, каталогам и файлам могут зависеть от учетной записи пользователя и тех групп, к которым он принадлежит. Каждый раз, когда пользователь обращается к объекту файловой системы, его права доступа проверяются по списку разреше­ний данного объекта. Если пользователь обладает достаточным уровнем прав, его запрос удовлетворяется; в противном случае запрос отклоняется. Эта модель безопасности применяется как при локальной регистрации пользователей на компьютерах с NT , так и при удаленных сетевых запросах.

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

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

Основной недостаток файловой системы NTFS - служебные данные занимают много места (например, каждый элемент каталога занимает 2 Кбайт) - для малых раз­делов служебные данные могут занимать до 25% объема носителя.

Þ система NTFS не может использоваться для форматирования флоппи-дисков. Не стоит пользоваться ею для форматирования разделов объемом менее 100 Мбайт.

Файловая система ОС UNIX

В мире UNIX существует несколько разных видов файловых систем со своей структурой внешней памяти. Наиболее известны традиционная файловая система UNIX System V (s5) и файловая система семейства UNIX BSD (ufs).

Рассмотрим s 5.

Файл в системе UNIX представляет собой множество символов с произвольным доступом.

Файл имеет такую структуру, которую налагает на него пользователь.

Файловая система Unix, это иерархическая, многопользовательская файловая система.

Файловая система имеет древовидную структуру. Вершинами (промежуточными узлами) дерева являются каталоги со ссылками на другие каталоги или файлы. Листья дерева соответствуют файлам или пустым каталогам.

Замечание. На самом деле файловая система Unix не является древообразной. Дело в том, что в системе имеется возможность нарушения иерархии в виде дерева, так как имеется возможность ассоциировать несколько имен с одним и тем же содержимым файла .

Структура диска

Диск разделен на блоки. Размер блока данных определяется при форматировании файловой системы командой mkfs и может быть установлен 512, 1024, 2048, 4096 или 8192 байтов.

Считаем по 512 байт (размер сектора).

Дисковое пространство делится на следующие области (см. рис.):

· загрузочный блок;

· управляющий суперблок;

· массив i -узлов;

· область для хранения содержимого (данных) файлов;

· совокупность свободных блоков (связанных в список);

Блокначальной загрузки

Суперблок

i - узел

. . .

i - узел

Замечание. Для файловой системы UFS - все это для группы цилиндров повторяется (кроме Boot -блока) + выделена специальная область для описания группы цилиндров

Блок начальной загрузки

Блок размещен в блоке №0. (Вспомним, что размещение этого блока в нулевом блоке системного устройства определяется аппаратурой, так как аппаратной загрузчик всегда обращается к нулевому блоку системного устройства. Это последний компонент файловой системы, который зависит от аппаратуры.)

Boot -блок содержит программу раскрутки, которая служит для первоначального запуска ОС UNIX . В файловых системах s 5 реально используется boot -блок только корневой файловой системы. В дополнительных файловых системах эта область присутствует, но не используется.

Суперблок

Он содержит оперативную информацию о состоянии файловой системы, а также данные о параметрах настройки файловой системы.

В частности суперблок содержит следующую информацию

· количество i -узлов (индексных дескрипторов);

· размер раздела???;

· список свободных блоков;

· список свободных i -узлов;

· и другое.

Обратим внимание! Свободное пространство на диске образует связанный список свободных блоков . Этот список хранится в суперблоке.

Элементами списка являются массивы из 50 элементов(если блок = 512 байт, то элемент = 16 бит):

· в элементах массива №№1-48 записаны номера свободных блоков пространства блоков файлов с 2 до 49.

· в №0 элементе содержится указатель на продолжение списка, а

· в последнем элементе (№49) содержится указатель на свободный элемент в массиве.

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

Так как размер массива - 50 элементов, то возможны две критические ситуации:

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

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

Список свободных i -узлов . Это буфер, состоящий из 100 элементов. В нем находится информация о 100 номерах i -узлов, которые свободны в данный момент.

Суперблок всегда находится в ОЗУ

Þ все операции (освобождение и занятие блоков и i -узлов происходят в ОЗУ Þ минимизация обменов с диском.

Но! Если содержимое суперблока не будет записано на диск и выключено питание, то возникнут проблемы (несоответствие реального состояния файловой системы и содержимого суперблока). Но это уже требование к надежности аппаратуры системы.

Замечание . В файловых системах UFS для повышения устойчивости поддерживается несколько копий суперблока (по одной копии на группу цилиндров)

Область индексных дескрипторов

Это массив описаний файлов, называемых i -узлами (i - node ) .(64-х байтные?)

Каждый индексный описатель (i -узел) файла содержит:

· Тип файла (файл/каталог/специальный файл/fifo/socket)

· Атрибуты (права доступа) - 10

· Идентификатор владельца файла

· Идентификатор группы-владельца файла

· Время создания файла

· Время модификации файла

· Время последнего доступа к файлу

· Длина файла

· Количество ссылок к данному i -узлу из различных каталогов

· Адреса блоков файла

! Обратите внимание . Здесь нет имени файла

Рассмотрим подробнее как организована адресация блоков , в которых размещен файл. Итак, в поле с адресами находятся номера первых 10 блоков файла.

Если файл превышает десять блоков, то начинает работать следующий механизм: 11-й элемент поля содержит номер блока, в котором размещены 128(256) ссылок на блоки данного файла. В том случае, если файл еще больше - то используется 12й элемент поля- он содержит номер блока, в котором содержится 128(256) номеров блоков, где каждый блок содержит 128(256) номеров блоков файловой системы. А если файл еще больше, то используется 13 элемент - где глубина вложенности списка увеличена еще на единицу.

Таким образом мы можем получить файл размером (10+128+128 2 +128 3)*512.

Это можно представить в следующем виде:

Адрес 1-го блока файла

Адрес 2-го блока файла

Адрес 10-го блока файла

Адрес блока косвенной адресации (блока с 256 адресами блоков)

Адрес блока 2-й косвенной адресации (блока с 256 адресами блоков с адресами)

Адрес блока 3-й косвенной адресации (блока с адресами блоков с адресами блоков с адресами)

Защита файла

Теперь обратим внимание на идентификаторы владельца и группы и биты защиты.

В ОС Unix используется трехуровневая иерархия пользователей :

Первый уровень - все пользователи.

Второй уровень - группы пользователей. (Все пользователи подразделены на группы.

Третий уровень - конкретный пользователь (Группы состоят из реальных пользователей). В связи с этой трехуровневой организацией пользователей каждый файл обладает тремя атрибутами:

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

2) Защита доступа к файлу. Доступ к каждому файлу ограничивается по трем категориям:

· права владельца (что может делать владелец с этим файлом, в общем случае - не обязательно все, что угодно);

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

· все остальные пользователи системы;

По этим трем категориям регламентируются три действия: чтение из файла, запись в файл и исполнение файла (в мнемонике системы R,W,X, соответственно). В каждом файле по этим трем категориям определено - какой пользователь может читать, какой писать, а кто может запускать его в качестве процесса.

Организация каталогов

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

Элемент каталога состоит из двух полей:

1)номер i -узла (порядковый номер в массиве i -узлов)и

2)имя файла:

Каждый каталог содержит два специальных имени: ‘.’ - сам каталог; ‘..’ - родительский каталог.

(Для корневого каталога родитель ссылается на него же самого.)

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

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

Итак, чтобы получить доступ к файлу по имени, операционная система

1. находит это имя в каталоге, содержащем файл,

2. получает номер i -узла файла,

3. по номеру находит i- узел в области i-узлов,

4. из i-узла получает адреса блоков, в которых расположены данные файла,

5. по адресам блоков считывает блоки из области данных.

Структура дискового раздела в EXT 2 FS

Все пространство раздела делится на блоки. Блок может иметь размер от 1, 2 или 4 килобайта. Блок является адресуемой единицей дискового пространства.

Блоки, в свою область объединяются в группы блоков. Группы блоков в файловой системе и блоки внутри группы нумеруются последовательно, начиная с 1. Первый блок на диске имеет номер 1 и принадлежит группе с номером 1. Общее число блоков на диске (в разделе диска) является делителем объема диска, выраженного в секторах. А число групп блоков не обязано делить число блоков, потому что последняя группа блоков может быть не полной. Начало каждой группы блоков имеет адрес, который может быть получен как ((номер группы - 1)* (число блоков в группе)).

Каждая группа блоков имеет одинаковое строение. Ее структура представлена в таблице.

Первый элемент этой структуры (суперблок) - одинаков для всех групп, а все остальные - индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков (за исключением группы 1, в которой в первом блоке расположена загрузочная запись). Суперблок является начальной точкой файловой системы. Он имеет размер 1024 байта и всегда располагается по смещению 1024 байта от начала файловой системы. Наличие нескольких копий суперблока объясняется чрезвычайной важностью этого элемента файловой системы. Дубликаты суперблока используются при восстановлении файловой системы после сбоев.

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

Вслед за суперблоком расположено описание группы блоков (Group Descriptors). Это описание содержит:

Адрес блока, содержащего битовую карту блоков (block bitmap) данной группы;

Адрес блока, содержащего битовую карту индексных дескрипторов (inode bitmap) данной группы;

Адрес блока, содержащего таблицу индексных дескрипторов (inode table) данной группы;

Счетчик числа свободных блоков в данной группе;

Число свободных индексных дескрипторов в данной группе;

Число индексных дескрипторов в данной группе, которые являются каталогами

и другие данные.

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

Файловая система Ext 2 характеризуется:

  • иерархической структурой,
  • согласованной обработкой массивов данных,
  • динамическим расширением файлов,
  • защитой информации в файлах,
  • трактовкой периферийных устройств (таких как терминалы и ленточные устройства) как файлов.

Внутреннее представление файлов

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

Индексные дескрипторы файлов

Каждому файлу на диске соответствует индексный дескриптор файла, который идентифицируется своим порядковым номером - индексом файла. Это означает, что число файлов, которые могут быть созданы в файловой системе, ограничено числом индексных дескрипторов, которое либо явно задается при создании файловой системы, либо вычисляется исходя из физического объема дискового раздела. Индексные дескpиптоpы существуют на диске в статической форме и ядро считывает их в память прежде, чем начать с ними работать.

Индексный дескриптор файла содержит следующую информацию:

- Тип и права доступа к данному файлу.

Идентификатор владельца файла (Owner Uid).

Размер файла в байтах.

Время последнего обращения к файлу (Access time).

Время создания файла.

Время последней модификации файла.

Время удаления файла.

Идентификатор группы (GID).

Счетчик числа связей (Links count ).

Число блоков, занимаемых файлом.

Флагифайла (File flags)

Зарезервировано для ОС

Указатели на блоки, в которых записаны данные файла (пример прямой и косвенной адресации на рис.1)

Версия файла (для NFS)

ACL файла

ACL каталога

Адресфрагмента (Fragment address)

Номерфрагмента (Fragment number)

Размер фрагмента (Fragment size )

Каталоги

Каталоги являются файлами.

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

Когда какой-либо пpоцесс использует путь к файлу, ядpо ищет в каталогах соответствующий номеp индексного дескpиптоpа. После того, как имя файла было пpеобpазовано в номеp индексного дескpиптоpа, этот дескpиптоp помещается в память и затем используется в последующих запpосах.

Дополнительные возможности EXT2 FS

В дополнение к стандаpтным возможностям Unix, EXT2fs пpедоставляет некотоpые дополнительные возможности, обычно не поддеpживаемые файловыми системами Unix.

Файловые атpибуты позволяют изменять pеакцию ядpа пpи pаботе с набоpами файлов. Можно установить атpибуты на файл или каталог. Во втоpом случае, файлы, создаваемые в этом каталоге, наследуют эти атpибуты.

Во вpемя монтиpования системы могут быть установлены некотоpые особенности, связанные с файловыми атpибутами. Опция mount позволяет администpатоpу выбpать особенности создания файлов. В файловой системе с особенностями BSD, файлы создаются с тем же идентификатоpом гpуппы, как и у pодительского каталога. Особенности System V несколько сложнее. Если у каталога бит setgid установен, то создаваемые файлы наседуют идентификатоp гpуппы этого каталога, а подкаталоги наследуют идентификатоp гpуппы и бит setgid. В пpотивном случае, файлы и каталоги создаются с основным идентификатоpом гpуппы вызывающего пpоцесса.

В системе EXT2fs может использоваться синхpонная модификация данных, подобная системе BSD. Опция mount позволяет администpатоpу указывать чтобы все данные (индексные дескpиптоpы, блоки битов, косвенные блоки и блоки каталогов) записывались на диск синхpонно пpи их модификации. Это может быть использовано для достижения высокой потности записи инфоpмации, но также пpиводит к ухудшению пpоизводительности. В действительности, эта функция обычно не используется, так как кpоме ухудшения пpоизводительности, это может пpивести к потеpе данных пользователей, котоpые не помечаются пpи пpовеpке файловой системы.

EXT2fs позволяет пpи создании файловой системы выбpать pазмеp логического блока. Он может быть pазмеpом 1024, 2048 или 4096 байт. Использование блоков большого объема пpиводит к ускоpению опеpаций ввода/вывода (так как уменьшается количество запpосов к диску), и, следовательно, к меньшему пеpемещению головок. С дpугой стоpоны, использование блоков большого объема пpиводит к потеpе дискового пpостpанства. Обычно последний блок файла используется не полностью для хpанения инфоpмации, поэтому с увеличением объема блока, повышается объем теpяемого дискового пpостpанства.

EXT2fs позволяет использовать ускоpенные символические ссылки. Пpи пpименении таких ссылок, блоки данных файловой системы не используются. Имя файла назначения хpанится не в блоке данных, а в самом индексном дескpиптоpе. Такая стpуктуpа позволяет сохpанить дисковое пpостpанство и ускоpить обpаботку символических ссылок. Конечно, пpостpанство, заpезеpвиpованное под дескpиптоp, огpаничено, поэтому не каждая ссылка может быть пpедставлена как ускоpенная. Максимальная длина имени файла в ускоpенной ссылке pавна 60 символам. В ближайшем будующем планиpуется pасшиpить эту схему для файлов небольшого объема.

EXT2fs следит за состоянием файловой системы. Ядpо использует отдельное поле в супеpблоке для индикации состояния файловой системы. Если файловая система смонтиpована в pежиме read/write, то ее состояние устанавливается как "Not Clean". Если же она демонтиpована или смонтиpована заново в pежиме read-only, то ее состояние устанавливается в "Clean". Во вpемя загpузки системы и пpовеpке состояния файловой системы, эта инфоpмация используется для опpеделения необходимости пpовеpки файловой системы. Ядpо также помещает в это поле некотоpые ошибки. Пpи опpеделении ядpом несоответствия, файловая система помечается как "Erroneous". Пpогpамма пpовеpки файловой системы тестиpует эту инфоpмацию для пpовеpки системы, даже если ее состояние является в действительности "Clean".

Длительное игноpиpование тестиpования файловой системы иногда может пpивести к некотоpым тpудностям, поэтому EXT2fs включает в себя два метода для pегуляpной пpовеpки системы. В супеpблоке содеpжится счетчик монтиpования системы. Этот счетчик увеличивается каждый pаз, когда система монтиpуется в pежиме read/write. Если его значение достигает максимального (оно также хpанится в супеpблоке), то пpогpамма тестиpования файловой системы запускает ее пpовеpку, даже если ее состояние является "Clean". Последнее вpемя пpовеpки и максимальный интеpвал между пpовеpками также хpанится в супеpблоке. Когда же достигается максимальный интеpвал между пpовеpками, то состояние файловой системы игноpиpуется и запускается ее пpовеpка.

Оптимизация пpоизводительности

Система EXT2fs содеpжит много функций, оптимизиpующих ее пpоизводительность, что ведет к повышению скоpости обмена инфоpмацией пpи чтении и записи файлов.

EXT2fs активно использует дисковый буфеp. Когда блок должен быть считан, ядpо выдает запpос опеpации ввода/вывода на несколько pядом pасположенных блоков. Таким обpазом, ядpо пытается удостовеpиться, что следующий блок, котоpый должен быть считан, уже загpужен в дисковый буфеp. Подобные опеpации обычно пpоизводятся пpи последовательном считывании файлов.

Система EXT2fs также содеpжит большое количество оптимизаций pазмещения инфоpмации. Гpуппы блоков используются для объединения соответствующих индексных дескpиптоpов и блоков данных. Ядpо всегда пытается pазместить блоки данных одного файла в одной гpуппе, так же как и его дескpиптоp. Это пpедназначено для уменьшения пеpемещения головок пpивода пpи считывании дескpиптоpа и соответствующих ему блоков данных.

Пpи записи данных в файл, EXT2fs заpанее pазмещает до 8 смежных блоков пpи pазмещении нового блока. Такой метод позволяет достичь высокой пpоизводительности пpи сильной загpуженности системы. Это также позволяет pазмещать смежные блоки для файлов, что укоpяет их последующее чтение.

Л 5.1. АРХИТЕКТУРА ПОСТРОЕНИЯ ОС

Ключевые слова: файл, расширение имени файла, атрибуты файла, файловая структура, каталог (папка), путь к файлу, форматирование, сектор, дорожка, цилиндр, таблица размещения файлов (FAT-таблица), кластер, файловая система, FAT 16, FAT 32, NTFS, MTF, CDFS, команды ОС, рабочий стол, панель задач, значок и ярлык объекта, главное меню Windows , окно Windows , строка заголовка, панель инструментов, drag-and-drop, drag, «Проводник », буфер обмена, «Norton Commander », шаблоны выделения и поиска файлов.

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

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

· интерфейса между пользователем и программно-аппаратными средствами компьютера (интерфейс пользователя);

· интерфейса между программным и аппаратным обеспечением (аппаратно-программный интерфейс);

· интерфейса между разными видами программного обеспечения (программный интерфейс).

Даже для одной аппаратной платформы, например такой, как
IBM PC, существует несколько операционных систем (ОС). Для примера, рассмотрим файловую структуру, основные объекты и приемы управления наиболее распространенных ОС: MS DOS и Windows XP.

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

В качестве единицы хранения данных принят объект переменной длины, называемый файлом.

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

Обычно в отдельном файле хранят данные, относящиеся к одному типу. В этом случае тип данных определяет тип файла.

Поскольку в определении файла нет ограничений на размер, можно представить себе файл, имеющий 0 байтов (пустой файл) , и файл, имеющий любое число байтов.



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

По способам именования файлов различают «короткое » (на имя файла отводится 8 символов, а на его расширение - 3 символа) и «длинное » имя (до 256 символов). Имя файла от его расширения разделяются точкой. Расширение файла является необязательным параметром и может отсутствовать.

В ОС MS DOS имя (не более 8 символов) и расширение (не более 3 символов) могут состоять из прописных и строчных латинских букв, цифр и символов:

- _ $ # & @ ! % () { } " ~ ^

Следует помнить, что для ОС линии MS DOS :

Между именем и расширением ставится точка, не входящая ни в имя, ни в расширение;

Имя файла можно набирать в любом регистре, т.к. для системы все буквы строчные;

Символы, не использующиеся в имени файла

* = + \ ; : , . < > / ?

Имена устройств не могут использоваться в качестве имен файлов:

AUX - имя дополнительного устройства ввода-вывода;

CON - имя клавиатуры при вводе или дисплея при выводе;

LPT1 … LPT3 - имена параллельных портов;

COM1 … COM3 - имена последовательных портов;

PRN - имя печатающего устройства;

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

С появлением ОС Windows 95 введено понятие «длинного » имени. Такое имя может содержать до 256 символов, что достаточно для создания содержательных имен файлов. «Длинное » имя может содержать любые символы, кроме девяти специальных:

\ / : * ? " < > |

В имени разрешается использовать пробелы и несколько точек. Расширением имени считаются все символы, идущие после последней точки.

Наряду с «длинным » именем ОС Windows 95/98/Me/2000/XP создают также и короткое имя файла - оно необходимо для возможности работы с данным файлом на рабочих местах с устаревшими операционными системами.

Использование «длинных » имен файлов в последних ОС Windows имеет ряд особенностей .

1. Если «длинное » имя файла включает пробелы, то в служебных операциях его надо заключать в кавычки. Рекомендуется не использовать пробелы, а заменять их символами подчеркивания.

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

3. Кроме ограничения на длину имени файла (256 символов) существует гораздо более жесткое ограничение на длину полного имени файла (в него входит путь доступа к файлу, начиная от вершины иерархической структуры). Полное имя не может быть длиннее 260 символов.

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

5. Прописные и строчные буквы не различаются ОС. Имена Письмо.txt и письмо. txt соответствуют одному и тому же файлу.

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

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

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

· ехе - готовый к исполнению файл (winrar.exe ; winword.exe );

· сот - файл операционной системы (command.com );

· sys - файл операционной системы (io.sys ) - обычно это драйвер внешнего устройства;

· bat - командный файл операционной системы MS DOS (autoexec.bat ).

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

ASM - текст программы на языке ассемблер ;

AVI, MPEG, MPG, WMV и т.д. - различные форматы видеофайлов, для просмотра можно воспользоваться, например, Windows Media Player - тип данных: изображение;

BAK - старая версия файла;

BAS - текст программы на языке Бейсик ;

BMP - документ, созданный в графическом редакторе, например, Paint - тип данных: изображение;

C - текст программы на языке Си ;

CDR CorelDraw - тип данных: изображение;

CPP - текст программы на языке C ++;

dbf - файл базы данных, созданный, например, в СУБД FoxPro ;

DOC - документ, созданный в текстовом процессоре Microsoft Word - тип данных: текст;

DWG, DXF - графические файлы, созданные в AutoCAD ;

HTML - документ, рассчитанный на публикацию в Интернете;

LIB - библиотека (обычно объектных модулей);

MDB - файл базы данных, созданный в СУБД Microsoft Access ;

MP3, MID, WMA, WAV – различные форматы звуковых файлов - тип данных: звук;

OBJ - объектный модуль;

PAS - текст программы на языке Паскаль ;

PDF - PDF -документ, созданный и предназначенный для просмотра в программе Adobe Reader ;

PPT - файл презентации, созданной в Microsoft PowerPoint ;

PSD - графический файл, созданный в графическом процессоре Adobe Photoshop ;

RAR WinRar ;

RTF - документ, созданный в текстовом редакторе WordPad ;

TIF, GIF, JPG - различные форматы графических файлов;

TMP - временный файл;

TXT - текстовый файл, например, созданный в программе Блокнот ;

XLS - электронная книга, созданная в табличном процессоре Microsoft Excel - тип данных: символы (текст или числа);

ZIP - архивный файл, созданный программой архиватором WinZip .

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

Основных атрибутов четыре:

· Только для чтения (Read only);

· Скрытый (Hidden);

· Системный (System);

· Архивный (Archive).

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

Атрибут «Скрытый» сигнализирует операционной системе о том, что данный файл не следует отображать на экране при проведении файловых операций. Это мера защиты против случайного (умышленного или неумышленного) повреждения файла.

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

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

Хранение файлов организуется в иерархической структуре, которая в данном случае называется файловой структурой (рис. 1).

Рис. 1. Иерархическая структура диска

Файловая структура - иерархическая структура, в виде которой операционная система отображает файлы и каталоги (папки).

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

Имена внешних носителей информации. Диски, на которых хранится информация в компьютере, имеют свои имена - каждый диск назван буквой латинского алфавита, а затем ставится двоеточие. Так, для дискет всегда отводятся буквы А: и В: . Логические диски винчестера именуются, начиная с буквы С: . После всех имен логических дисков следуют имена дисководов для компакт-дисков. Например, установлены: дисковод для дискет, винчестер, разбитый на 3 логических диска и дисковод для компакт-дисков. Определить буквы всех носителей информации. А: - дисковод для дискет; С: , D: , Е: - логические диски винчестера; F: - дисковод для компакт-дисков.

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

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

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

Когда используется файл не из текущего каталога, программе, осуществляющей доступ к файлу, необходимо указать, где именно этот файл находится. Это делается с помощью указания пути к файлу.

Путь к файлу - это имя носителя (диска) и последовательность имен каталогов, в ОС Windows разделенных символом «\» (в ОС линии UNIX используется символ «/»). Этот путь задает маршрут к тому каталогу, в котором находится нужный файл.

Для указания пути к файлу используют два различных метода. В первом случае каждому файлу дается абсолютное имя пути (полное имя файла), состоящее из имен всех каталогов от корневого до того, в котором содержится файл, и имени самого файла. Например, путь С:\Abby\Doc\otchet.doc означает, что корневой каталог диска С: содержит каталог Abby , который, в свою очередь, содержит подкаталог Doc , где находится файл otchet.doc . Абсолютные имена путей всегда начинаются от имени носителя и корневого каталога и являются уникальными. Применяется и относительное имя пути. Оно используется вместе с понятием текущего каталога. Пользователь может назначить один из каталогов текущим рабочим каталогом. В этом случае все имена путей, не начинающиеся с символа разделителя, считаются относительными и отсчитываются относительно текущего каталога. Например, если текущим каталогом является С:\Abby , тогда к файлу с абсолютным путем С:\Abby\ можно обратиться как Doc\otchet.doc .

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

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

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

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

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

Обычный объем сектора - 512 байт. На одной стороне размещается 80 дорожек. Каждая дорожка содержит 18 секторов.

Под цилиндром понимается совокупность всех дорожек, принадлежащих разным поверхностям и находящихся на равном удалении от оси вращения . Физическая структура хранения данных представлена на рисунке 2.

Рис. 2. Физическая структура хранения информации

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

Наименьшей физической единицей хранения информации является сектор. Поскольку размер FAT- таблицы ограничен, то для дисков, размер которых превышает 32 Мбайта, обеспечить адресацию к каждому отдельному сектору не представляется возможным. В связи с этим группы секторов условно объединяются в кластеры. Кластер является наименьшей единицей адресации к информации. Размер кластера, в отличие от размера сектора, не фиксирован и зависит от емкости диска.

Как было сказано ранее, информация на дисках записывается в секторах фиксированной длины, и каждый сектор и расположение каждой физической записи (сектора) на диске однозначно определяется тремя числами: номерами поверхности диска , цилиндра и сектора на дорожке . И контроллер диска работает с диском именно в этих терминах. А пользователь желает использовать не сектора, цилиндры и поверхности, а файлы и каталоги. Поэтому как-то требуется при операциях с файлами и каталогами на дисках перевести это в понятные контроллеру действия: чтение и запись определенных секторов диска. А для этого необходимо установить правила, по которым выполняется этот перевод, то есть, прежде всего, определить, как должна храниться и организовываться информация на дисках. Набор этих правил и называется файловой системой.

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

· как хранятся файлы и каталоги на диске;

· какие хранятся сведения о файлах и каталогах;

· как можно узнать, какие участки диска свободны, а какие - нет;

· формат каталогов и другой служебной информации на диске.

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

Файловая система, наиболее распространенная на IBM PC -совместимых компьютерах, была введена еще в начале 80-х годов в операционных системах MS DOS 1.0 и 2.0. Эта файловая система достаточно примитивна, так как она была создана для хранения данных на дискетах. Обычно эта файловая система называется FAT , так как самой важной структурой данных в ней является таблица размещения файлов на диске, по-английски - file allocation table, сокращенно - FAT . Эта таблица содержит информацию о том, какие участки (кластеры) диска свободны, и о цепочках кластеров, образующих файлы и каталоги.

В файловой системе FAT имена файлов и каталогов должны состоять не более чем из 8 символов плюс три символа в расширении имени. Она приводит к значительным потерям (до 20%) дискового пространства из-за больших размеров кластеров на дисках высокой емкости. Это связано с тем, что в конце последнего кластера файла остается свободное место, в среднем равное половине кластера. А на больших дисках размер кластеров FAT может достигать 32 Кбайт. Таким образом, на диске емкостью
2 Гбайта с 20000 файлов потери составят 320 Мбайт, то есть около 16%. Наконец, файловая система FAT малопроизводительна, особенно для больших дисков, не приспособлена к многозадачной работе (все операции требуют обращений к таблице размещения файлов, а потому до завершения одной операции нельзя начинать другую).

При разработке Windows 95 фирма Microsoft решила не вводить новую файловую систему, а залатать имеющуюся файловую систему FAT , позволив присваивать файлам и каталогам длинные имена. Эта файловая система стала называться FAT 32 . Принятый в Windows 95 подход хорош тем, что позволяет использовать старые диски с файловой системой FAT - на них просто начинают записываться длинные имена. Но все же это решение весьма искусственное, и многие программы - для починки файловой системы дисков, «сжатия» дисков, резервного копирования и т.д. - могут привести к потере длинных имен на диске. FAT 32 поддерживает меньшие размеры кластеров, что позволяет более эффективно использовать дисковое пространство.

При разработке операционной системы Windows NT была создана новая файловая система - NTFS . Она была ориентирована на диски большого объема, содержащие множество файлов, в них приняты существенные меры по обеспечению эффективности хранения данных и контроля доступа к ним. Эта файловая система поддерживает длинные имена файлов. На логических дисках емкостью 1-2 Гбайта файловая система NTFS позволяет хранить в среднем на 10-15% больше информации, чем FAT . А доступ к файлам в ней осуществляется заметно быстрее, особенно в многозадачной среде.

При формировании файловой системы NTFS программа форматирования создает файл Master File Table (MTF ) и другие области для хранения метаданных. Метаданные используются NTFS для реализации файловой структуры. Первые 16 записей в MTF зарезервированы самой NTFS . Местоположение файлов метаданных записано в загрузочном секторе диска. Если первая запись в MTF повреждена, NTFS считывает вторую запись для нахождения копии первой. Полная копия загрузочного сектора располагается в конце тома. В MTF хранятся метаданные, такие как копия первых четырех записей (гарантирует доступ к MTF в случае, если первый сектор поврежден). MTF содержит информацию о томе - метку и номер версии. В MTF находится таблица имен атрибутов и описания, корневой каталог и др. Остальные строки MTF содержат записи для каждого файла и каталога, расположенных на данном томе. Разработчики NTFS , не забывая об эффективности, старались также обеспечить надежность файловой системы и восстанавливаемость данных при сбоях. Для этого, в частности, NTFS дублирует всю критически важную информацию и обеспечивает регистрацию всех изменений на дисках в специальном файле регистрации, причем для каждого изменения запоминается и способ его отмены. В результате практически при любых сбоях NTFS автоматически восстанавливается. NTFS также (в отличие от FAT ) может работать с логическими дисками и файлами размером более 2 Гбайт - максимальный размер логических дисков и файлов - 4х10 18 байт.

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

Особая файловая система разработана для компакт-дисков (CD-ROM ). Это оказалось необходимым, так как само физическое устройство компакт-дисков не такое, как у жестких дисков или дискет: в них информация записывается не в кольцевых дорожках, а в единственной спиралеобразной дорожке (как у аудиокомпакт-дисков). Эта файловая система называется CDFS .

Таблица 1

Сравнительные характеристики файловых систем

NTFS FAT 32 FAT
Поддерживаемые операционные системы Windows NT с 4 пакетом обновлений, Windows 2000, Windows XP MS-DOS, Windows 95 OSR2, Windows 98, Windows Millennium Edition, Windows NT, Windows 2000, Windows XP
Возможные размеры логических дисков Рекомендуемый минимальный размер логического диска (тома) равен примерно 10 МБ. Допускаются размеры томов свыше 2 ТБ. Не может использоваться для гибких дисков Логический диск (том) объемом от 512 МБ до 2 ТБ. Может использоваться для гибких дисков Логический диск (том) объемом до 4 ГБ. Может использоваться для гибких дисков
Возможные размеры хранимых файлов Максимальный размер файла ограничен только размером тома Максимальный размер файла равен 4 ГБ Максимальный размер файла равен 2 ГБ

Файл – это информация, которая хранится на машинном носителе информации под определенным именем.

В файлах могут храниться программы, тексты, данные.

Файлы идентифицируются (однозначно определяются) именами. Пользователи дают файлам символьные имена. В некоторых ОС, например в ОС фирмы Microsoft, каждое имя файла состоит непосредственно из имени файла , даваемого пользователем, и расширения . При этом учитываются ограничения ОС как на используемые в имени символы, так и на длину имени. До недавнего времени эти границы были весьма узки. Например, файловая система операционной системы MS-DOS ограничивала длину имени схемой 8.3 (8 символов – отводилось под имя, 3 - под расширение). Современные файловые системы, как правило, поддерживают длинные символьные имена файлов. ОС семейства Windows позволяют давать имена размером до 255 символов. Расширение отделяется от имени файла символом “.” (точка).

Расширение показывает тип файла:

ехе, сом выполняемые файлы, т.е. программы, написанные на одном из языков программирования;

doc - файлы, созданные в текстовом редакторе Word;

xls - файлы, созданные в табличном процессоре Excel;

mdb – файлы системы управления базами данных (СУБД) Access.

Обычно для удобства работы файлы объединяются в каталоги (папки).

Чтобы операционная система могла обращаться к файлам, необходимо указывать полное имя файла , состоящее из имени внешнего устройства (обычно диска), последовательности вложенных папок и имени файла. Например,

C:\User\Письмо.doc полное имя файлаПисьмо.doc , находящегося на диске С: в папке User . последовательность имени внешнего устройства и всех вложенных папок называется полным путём к файлу .

Иногда при выполнении определенных операций (поиск, копирование, удаление файлов) можно использовать шаблоны имен файлов .

Шаблоном называется обобщенное имя для группы файлов, в котором имеются символы: * или?.

Символ * обозначает, что вместо него, начиная с той позиции, где он стоит, и до конца имени могут стоять любые допустимые символы.

Символ ? обозначает, что в данной позиции может стоять любой, но только один допустимый символ.

Например,

шаблон*.doc обозначает все файлы с расширением.doc,

шаблон Письмо?.doc обозначает все файлы с именами Письмо1.doc, Письмо3.doc, ПисьмоZ.doc, ПисьмоA.doc, и т.д.

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

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

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

Файловые системы фирмы Microsoft.

Ранние версии ОС Windows компании Microsoft использовали таблицы размещения файлов FAT (FAT – File Allocat ion Table ).

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

Для организации доступа к файлам, записанным на магнитных дисках ОС создает список секторов, выделенных каждому файлу. Обычно дисковое пространство выделяется файлам блоками из нескольких секторов, называемых кластерами 5 . Кластер – наименьшая единица адресации данных (определения места их расположения) на диске.

FAT состоит из ячеек, в которых хранятся номера кластеров, и главное отличие между различными FAT заключается в размере этих ячеек, определяемом количеством двоичных разрядов (бит). ОC Windows 95 использует FAT16, в которой под адрес кластера отводится 16 бит и, следовательно, число кластеров равно 65 536 (2 16). В случае, когда один кластер равен одному сектору (512 байт), максимальная емкость диска составит 32 Мбайт. С появлением дисков большой емкости кластер стал состоять из нескольких секторов -2, 4, 8 и т.д.

Здесь-то и возникает проблема нерационального использования дискового пространства. Дело в том, что один кластер не может содержать более одного файла. Тогда файл размером 1 Кбайт будет использовать кластер размером 8 Кбайт и 16 Кбайт в зависимости от размера диска. В версии ОС Windows 95 OSR2 впервые появился формат таблицы размещения файлов FAT32 (32 бит), и число кластеров возросло до 2 32 = 4 294 967 296, что позволяет использовать кластеры размером 4 Кбайт.

С каждым файлом связывается полное имя файла, дата создания файла, атрибуты файла, длина файла.

Элемент FAT для описания файла включает в себя:

    байт атрибута;

    время модификации;

    дата модификации;

    № 1-го кластера, с которого начинается запись файла;

    размер файла.

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

Файловая система FAT16 поддерживается всеми ОС фирмы Microsoft, некоторыми ОС семейства Unix, ОС семейства OS/2.

ОС Windows NT Workstation, Windows 2000 Professional и Windows XP поддерживают файловую систему NTFS.

Файловая система NTFS представляется в виде таблицы MFT (Master File Table ), имеющей следующий вид:

Максимальная длина таблицы – 1500 байтов.

Первые 16 записей – служебные, в них хранится информация, которая описывает саму таблицу MFT (аналог системной области FAT).

Начиная с 17-й записи идет описания файлов и папок:

    стандартная информация – дата и время создания файла, его размер;

    имя файла – хранится в 2-х вариантах: длинное (до 255 символов) и короткое (8 + 3), применяемое при использовании файла в MS DOS;

    дескриптор защиты указывает, кто и какие права имеет на данный файл или папку;

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

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

Операционная система

Файловая система

Microsoft MS-DOS

Microsoft Windows 95

Microsoft Windows 95 OSR2

Microsoft Windows 98

Microsoft Windows NT

Microsoft Windows 2000

NTFS, FAT16, FAT32

Microsoft Windows XP

NTFS, FAT16, FAT32

В ОС Windows NT, Windows 2000 Professional и Windows XP файловая система FAT поддерживается при работе на гибких магнитных дисках. На жестком диске поддерживается две файловые системы - FAT и NTFS.

Цель урока: Дать представление о файловой системе и объяснить принцип ее работы.

Задачи урока:

Образовательные: познакомить учащихся с поняти ями « файл», «файловые структуры» , закрепить полученные знания;

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

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

Форма организации урока: фронтальная.

Метод проведения урока: словесный, наглядно-демонстрационный.

Тип урока: комбинированный.

Аппаратное обеспечение: мультимедийный проектор, презентация.

План урока:

1. Организационный момент (2 мин).

2. Объяснение нового материала (15 мин).

3. Закрепление нового материала (5 мин).

4. практическая работа (20 мин).

5. Постановка домашнего задания (1 мин).

6. Подведение итогов (2 мин).

Ход урока:

1. Организационный момент: Контроль отсутствующих. Формулировка темы и целей урока.

Сегодня на уроке мы узнаем:

что такое файл;

имя файла;

логические диски;

файловая структура диска;

путь к файлу, полное имя файла.

2. Объяснение нового материала:

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

Файл (англ. file ) – последовательность числа байтов, обладающая уникальным собственным именем на машинных носителях.

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

Файл – это информация, хранящаяся на внешнем носителе и объединенная общим именем.

Для прояснения смысла этого понятия удобно воспользоваться следующей аналогией: сам носитель информации (диск) подобен книге. Мы говорили о том, что книга – это внешняя память человека, а магнитный диск – внешняя память компьютера. Книга состоит из глав (рассказов, разделов), каждый из которых имеет название. Также и файлы имеют свои названия. Их называют именами файлов. В начале или в конце книги обычно присутствует оглавление – список названий глав. На диске тоже есть такой список-каталог, содержащий имена хранимых файлов. Каталог можно вывести на экран, чтобы узнать, есть ли на данном диске нужный файл.

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

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

Работа с файлами на компьютере производится с помощью файловой системы. Файловая система – это функциональная часть ОС, обеспечивающая выполнение операций над файлами.

Чтобы найти нужный файл, пользователю должно быть известно: а) какое имя у файла; б) где хранится файл.

Практически во всех операционных системах имя файла составляется из двух частей, разделенных точкой. Например: myprog.pas

Слева от точки находится собственно имя файла (myprog) Следующая за точкой часть имени называется расширением файла (pas). Обычно в именах файлов употребляются латинские буквы и цифры. В большинстве ОС максимальная длина расширения - 3 символа. Кроме того, имя файла может и не иметь расширения. В операционной системе Windows в именах файлов допускается использование русских букв; максимальная длина имени – 256 символов, кроме девяти специальных: \ / : * ? “ < > |.

В именовании можно пользоваться пробелами и точками. А заканчивался файл из трех символов, составляющих так званое расширение.

Расширение файла – хаотичная последовательность символов, добавляемых в конец.

Тип файла

Расширение

Исполняемые программы

exe, com

Текстовые файлы

txt, rtf, doc

Графические файлы

bmp, gif, jpg, png, pds

Web-страницы

htm, html

Звуковые файлы

wav, mp3, midi, kar, ogg

Видео файлы

avi, mpeg

Код (текст) программы на языках программирования

bas, pas, cpp

Расширение указывает, какого рода информация хранится в данном файле.

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

На одном компьютере может быть несколько дисководов – устройств работы с дисками. Каждому дисководу присваивается однобуквенное имя (после которого ставится двоеточие), например А:, В:, С:. Часто на персональных компьютерах диск большой емкости, встроенный в системный блок (его называют жестким диском), делят на разделы. Каждый из таких разделов называется логическим диском, и ему присваивается имя С:, D:, Е: и т. д. Имена А: и В: обычно относятся к сменным дискам малого объема – гибким дискам (дискетам). Их тоже можно рассматривать как имена дисков, только логических, каждый из которых полностью занимает реальный (физический) диск. Следовательно, А:, В:, С:, D: – это всё имена логических дисков.

Имя логического диска, содержащего файл, является первой «координатой», определяющей место расположения файла.

Вся совокупность файлов на диске и взаимосвязей между ними называется файловой структурой. Различные ОС могут поддерживать разные организации файловых структур.

Виды файловой структуры:

1) Одноуровневая – последовательность имен файлов, используема для дисков с небольшим количеством файлов. Одноуровневая файловая структура – это простая последовательность файлов. Для отыскания файла на диске достаточно указать лишь имя файла. Например, если файл tetris.ехе находится на диске А:, то его «полный адрес» выглядит так: А:\tetris.ехе

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

2) Многоуровневая или иерархическая – древовидная структура, служащая для хранения тысяч файлов.

К функциям обслуживания файловой структуры относятся такие операции (естественно, происходящие в среде какой-либо ОС):

    создание файлов

    создание каталогов

    удаление файлов и каталогов

В операционной системе Windows для обозначения понятия «каталог» используется термин «папка».

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

Организация файлов в виде древовидной структуры называется файловой системой . Принцип организации файловой системы - табличный.
То есть, информация о местонахождении файла на диске хранится в таблице размещения файлов (англ.
File Allocation Table, FAT ).

Структура FAT похожа на оглавление книги – операционная система использует ее для быстрого поиска файлов.

Позже была введена FAT32 - усовершенствованная версию FAT. Она могла поддерживать тома, объем которых уже может превышать 2 Гбайт (в отличие от FAT).

Далее появилась более перспективное направление в развитии файловых систем - NTFS ( New Technology File System - файловая система новой технологии), поддерживающая длинные имена файлов и предлагающая надежную систему безопасности данных.

Объем раздела NTFS не ограничен. Также, NTFS экономит место на диске, сжимая его самого, отдельные файлы и каталоги.

В Windows XP применяется и FAT32 и NTFS.

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

На рис. 2.9 имена каталогов записаны прописными буквами, а файлов – строчными. Здесь в корневом каталоге имеются две папки: IVANOV и РЕТROV и один файл fin.com. Папка IVANOV содержит в себе две вложенные папки PROGS и DАТА. Папка DАТА – пустая; в папке РROGS имеются три файла и т. д. На дереве корневой каталог обычно изображается символом\.

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

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

Вот всем знакомая сказочная аналогия понятия «путь к файлу»: «На дубе висит сундук, в сундуке - заяц, в зайце - утка, в утке - яйцо, в яйце - игла, на конце которой смерть Кощеева».

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

Если представленная на рис. 2.9 файловая структура хранится на диске С:, то полные имена некоторых входящих в нее файлов в символике операционных систем МS-DOS и Windows выглядят так:

C:\fin.com

C:\IVANOV\PROGS\prog1.pas

C :\ PETROV \ DATA \ task . dat

3. Закрепление нового материала:

1. Что такое файловая система? Файловая система – это функциональная часть ОС, обеспечивающая выполнение операций с файлами.

2. Объясните понятие "файл". Файл – это информация, хранящаяся на внешнем носителе и объединенная общим именем.

3. Какие существуют типы файловых таблиц? FAT , FAT32 и NTFS

4.Что такое расширение файла? Имя файла состоит из собственно имени и расширения. Расширение указывает на тип информации в файле (тип файла).

5. Функции файловой системы.

Создание файлов

Создание каталогов

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

Копирование, перемещение файлов

Удаление файлов и каталогов

Навигация по файловой системе (проводник) с целью доступа к определенному файлу

Управление атрибутами (свойствами) файлов (скрытие, только чтение и т.д.)

6. Что такое файловая структура диска? Файловая структура диска – это совокупность файлов на диске и взаимосвязей между ними. Файловые структуры бывают простыми и многоуровневыми (иерархическими).

7. Что такое каталог? Каталог – это поименованная совокупность файлов и подкаталогов (вложенных каталогов). Каталог самого верхнего уровня называется корневым. Он не вложен ни в какие каталоги.

8. Из чего состоит полное имя файла? Полное имя файла состоит из имени диска, пути к файлу на диске и имени файла.

4. Практическая работа. Операции с файлами и папками Windows . (раздаточный материал).

5. Постановка домашнего задания: §2.4 , ответить на вопросы в конце параграфа.

6. Подведение итогов: Выставление отметок за урок.

Лабораторная работа №10

ВЫВОД НА ДИСК И ПРИНТЕР

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

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

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

Что такое файловая структура

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

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

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

Рис. 1. Некоторое время данные хранятся в буфере

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

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


Рис. 2. Файловая структура хранит информацию, необходимую для нормального выполнения файловых операций

Почти все компиляторы Си и Си++ хранят информацию, необходимую для работы с файлами, в файле заголовков STDIO.H. Этот файл содержит определения констант, которые нужны для операций с файлами. Кроме того, он может содержать описание файловой структуры. Для того, чтобы воспользоваться функциями работы с файлами, программу следует начинать с инструкции

#include,

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

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

Указатель на файл

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

FILE *file_pointer;

Имя структуры FILE говорит программе о том, что определяемая переменная является указателем именно на файловую структуру. Звездочка предписывает создать указатель с соответствующим именем переменной.

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

FILE *infile, *outfile;

Как открыть файл

Связь между программой и файлом устанавливается при помощи функции fopen(), синтаксис которой показан на рис. 3.

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


Рис. 3. Синтаксис функции fopen()

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

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

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

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

FILE *cdfile;cdfile = fopen("CD.DAT", "w");

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

FILE *cdfile;cdfile = fopen("CD.DAT", "r");

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

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

FILE *cdfile;cdfile = fopen("PRN", "w");

Учтите, что вывод информации на принтер возможен только с режимом доступа "w".

Как Си/Си++ работает с файлами

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

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

Если файл открывается с режимом доступа "w", указатель также помещается в начало файла, так что первые введенные данные будут помещены в начало файла. При закрытии файла после введенного массива данных будет добавлен символ конца файла. Если файл к моменту его открытия с использованием режима доступа "w" уже существует, все содержащиеся в нем данные затираются и «поверх» них записывается новая информация, введенная с помощью процедуры записи. Любые данные, которые могут остаться не уничтоженными, располагаются после нового символа конца файла, так что к ним уже нельзя будет обратиться при следующем чтении данных из файла. Таким образом, любая попытка записи данных в существующий файл с использованием режима доступа "w" приведет к уничтожению хранящейся в нем на данный момент информации. Это произойдет даже в том случае, если файл будет просто открыт и закрыт, без записи каких-либо данных.

Если файл открывается с использованием режима доступа "a", указатель помещается на символ конца файла. Новые данные, которые записываются в файл, размещаются после уже существующих данных, а затем добавляется символ конца файла.

Как закрыть файл

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

Fclose(file_pointer);

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

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

Листинг 1. Использование одного указателя файла в двух операциях.

FILE *cdfile;if((cdfile = fopen("CD.DAT", "w")) == NULL) { puts("Невозможно открыть файл"); exit(); }/* Здесь должны располагаться инструкции записи в файл */fclose(cdfile);if((cdfile = fopen("CD.DAT", "r")) == NULL) { puts("Невозможно открыть файл"); exit(); }/* В этом месте должны быть записаны инструкции чтения из файла */fclose(cdfile);

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

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

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

Функции ввода и вывода

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

· посимвольная запись данных в файл или вывод их на принтер с использованием функции putc() или fputc();

· посимвольное чтение данных из файла с использованием функции getc() или fgetc();

· построчная запись данных в файл или вывод их на принтер с использованием функции fputs();

· построчное чтение данных из файла с использованием функции fgets();

· форматированный вывод символов, строк или чисел на диск или на принтер с помощью функции fprintf();

· форматированный ввод символов, строк или чисел из файла с помощью функции fscanf();

· запись целой структуры с использованием функции fwrite();

· чтение целой структуры с использованием функции fread().

Работа с символами

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

/*fputc.c*/#include main() { FILE *fp; char letter; if((fp = fopen("MYFILE","w"))==NULL) { puts("Невозможно открыть файл"); exit(); } do { letter=getchar(); fputc(letter, fp); } while(letter != "\r"); fclose(fp); }

Файл открывается с режимом доступа "w". Если файл с именем MYFILE не существует к моменту выполнения программы, он будет создан. В цикле do, с помощью функции getchar(), осуществляется ввод последовательности символов, которые затем записываются в файл с помощью функции putc(). Синтаксис записи putc() таков:

Putc(char_variable, file_pointer);

С теми же аргументами может использоваться и функция fputc().

Цикл выполняется до тех пор, пока не нажата клавиша Enter , которая вводит код «возврат каретки» (\r), после чего файл закрывается.

Работа со строками

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

Функция fputs() имеет следующий синтаксис:

Fputs(string_variable, file_pointer);

Эта функция выполняет построчную запись данных в файл или вывод на принтер, но не добавляет код «новая строка». Для того чтобы каждая строка записывалась на диск (или печаталась на принтере) действительно как отдельная строка, необходимо вводить код «новая строка» вручную. Например, в приведенной ниже программе создается файл имен:

/*fputc.c*/#include main() { FILE *fp; char flag; char name; if((fp = fopen("MYFILE","w"))==NULL) { puts("Невозможно открыть файл"); exit(); } flag = "y"; while(flag != "n") { puts("Введите имя"); gets(name); fputs(name, fp); fputs("\n",fp); printf("Желаете ввести другое имя?"); flag=getchar(); putchar("\n"); } fclose(fp); }

Выполнение цикла while продолжается до тех пор, пока в ответ на подсказку не будет введен символ n. В этом цикле осуществляется ввод имени с клавиатуры с помощью функции gets(), после чего имя записывается на диск с помощью функции fputs(). Далее в файл записывается код «новая строка», и, наконец, программа спрашивает пользователя, желает ли он продолжить ввод имен.

Если ваш компилятор может использовать функцию strlen(), можно несколько упростить процедуру ввода, используя следующие инструкции:

Printf("Пожалуйста, введите имя: ");gets(name);while(strlen(name) > 0) { fputs(name, fp); fputs("\n", fp); printf("Пожалуйста, введите имя: "); gets(name); }

Символы, которые вы набираете на клавиатуре, присваиваются строковой переменной name, а затем проверяется, не оказалась ли длина строки равной 0. Если на запрос сразу же нажать клавишу Enter, строка будет иметь нулевую длину и выполнение цикла прекратится. Если до нажатия Enter ввести хотя бы один символ, строка и код «новая строка» будут записаны на диск.

Некоторые компиляторы позволяют еще более упростить алгоритм ввода строки, например, так:

Printf("Пожалуйста, введите имя: ");while(strlen(gets(name)) > 0) { fputs(name, fp); fputs("\n", fp); printf("Пожалуйста, введите имя: "); }

где ввод строки выполняется внутри условия while.

Для того чтобы напечатать строку на принтере, вместо записи ее на диск используется имя файла "prn". Чтобы открыть файл, требуется указать:

If ((fp = fopen("prn", "w")) == NULL)

Для создания программы печати длина строки определяется равной 81 символу, чтобы строка могла уместиться во всю ширину экрана, прежде чем будет нажата клавиша Enter . В Листинге 2 приводится текст программы, которая демонстрирует, как можно написать простой текстовый процессор. Строка не посылается на принтер до тех пор, пока не нажата клавиша Enter , что позволяет с помощью клавиши Backspace корректировать ошибки ввода строки.

Листинг 2. Программа вывода строки на печатающее устройство.

/*wp.c*/#include "stdio.h"main() { FILE *fp; char line; if ((fp = fopen("prn", "w")) == NULL) { puts("Принтер не готов к работе"); exit(); } puts("Введите текст, после ввода каждой строки нажимайте Enter\n"); puts("Для прекращения ввода нажмите Enter в начале новой строки\n"); gets(line); while (strlen(line) > 0) { fputs(line, fp); fputs("\n", fp); gets(line); } fclose(fp); }

Чтение строк

Чтение строк из файла осуществляется с помощью функции fgets(). Синтаксис функции:

Fgets(string_variable, lenght, file_pointer);

Функция вводит строку целиком до символа новой строки, если ее длина не превышает значения, указанного в параметре lenght минус один символ. Параметр lenght является целым числом либо целочисленной константой или переменной, указывающей максимально возможное количество символов в строке.

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

/*fgets.c"/#include "stdio.h"main() { FILE *fp; char name; if ((fp = fopen("MYFILE", "r")) == NULL) { puts("Невозможно открыть файл"); exit(); } while(fgets(name, 12, fp) != NULL) { printf(name); } fclose(fp); }

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

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

Кстати, обратите внимание, что функция printf() используется в этом примере для вывода содержимого строковой переменной без указателей формата. Каждая строка, читаемая из файла, включает код «новая строка», который был записан в файл в инструкции fputs("\n", fp);, и никаких дополнительных кодов «новая строка» в параметры функции printf() включать не требуется.

Листинг 3. Форматированный вывод.

/*fprintf.c*/#include "stdio.h"main() { FILE *fp; char name; int quantity; float cost; if ((fp = fopen("MYFILE", "w")) == NULL) { puts("Невозможно открыть файл"); exit(); } printf("Введите наименование товара: "); gets(name); while (strlen(name) > 0) { printf("Введите цену товара: "); scanf("%f", &cost); printf("Введите количество единиц товара: "); scanf("%d", &quantity); fprintf(fp, "%s %f %d\n", name, cost, quantity); printf("Введите наименование товара: "); gets(name); } fclose(fp); }

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

Do { printf("Введите наименование товара: "); gets(name); printf("Введите цену: "); scanf("%f", &cost); printf("Введите количество единиц товара: "); scanf("%d", &quantity); fprintf(fp, "%s %f %d\n", name, cost, quantity); }while (strlen(name) > 0);

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

Внутри цикла while данные о цене и количестве каждого наименования товара вводятся с использованием функции scanf(), а затем записываются на диск с помощью инструкции

Fprintf(fp, "%s %f %d\n", name, cost, quantity);

Обратите внимание, что код «новая строка» записывается в файл в конце каждой строки. Если просмотреть содержимое файла с помощью команды TYPE операционной системы MS-DOS, то каждая строка инвентарной описи и на экране будет начинаться с новой строки:

Если бы код «новая строка» не был записан на диск, текст выводился бы подряд, в одну строку на экране, и выглядел примерно так:

Дискеты 1.120000 100лента 7.340000 150картридж 75.000000 3

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

Дискеты 1.120000 Memoryexлента 7.340000 Okaydataкартридж 75.000000 HP

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

Дискеты 1.120000 Memoryexлента

Все выведенные на диск данные, даже значения типа int или float, хранятся в виде текстовых символов. Об этом мы будем говорить чуть позже.

Листинг 4. Чтение форматированного текста из файла.

/*fscanf.c*/#include "stdio.h"main() { FILE *fp; char name; int quantity; float cost; if ((fp = fopen("MYFILE", "r")) == NULL) { puts("Невозможно открыть файл"); exit(); } while (fscanf(fp, "%s%f%d", name, &cost, &quantity) != EOF) { printf("Наименование товара: %s\n", name); printf("Цена: %.2f\n", cost); printf("Количество единиц: %d\n", quantity); } fclose(fp); }

Работа со структурами

Одним из способов преодолеть ограничения функции scanf() является объединение элементов данных в структуру с тем, чтобы впоследствии осуществлять ввод и вывод структур целиком. Структуру можно записать на диск с помощью функции fwrite() и прочитать из файла с помощью функции fread().

Синтаксис функции fwrite() такой:

Fwrite(&structure_variable, structure_size, number_of_structures, file_pointer);

На первый взгляд, эта инструкция выглядит несколько устрашающей, но на самом деле использовать ее очень легко:

· &structure_variable - имя структурной переменной с оператором получения адреса, сообщающим компилятору стартовый адрес информации, которую мы хотим записать на диск;

· structure_size - это количество символов в структуре; не обязательно подсчитывать его самому, для этого можно использовать библиотечную функцию sizeof(), записанную следующим образом:

Sizeof(structure_variable)

которая автоматически определит размер указанной структуры;

· number_of_structures - это целое число, определяющее количество структур, которые мы хотим записать в один прием; здесь всегда следует указывать число 1, если только вы не собираетесь создать массив структур и записать его одним большим блоком;

· file_pointer - указатель на файл.

В качестве примера предположим, что вы хотите записать на диск сведения о своей коллекции компакт-дисков. Используя структуру CD, которую мы подробно разбирали ранее, пишем инструкцию: fwrite(&disc, sizeof(disc), 1, fp);

Выполнение этой инструкции иллюстрирует рис. 5.

Текст программы, которая вводит данные в структуру CD, а затем сохраняет ее на диске, приведен в Листинге12.5. Для ввода имени создаваемого файла используется функция gets(). Переменная, в которой хранится имя файла, используется функцией fopen() для того, чтобы открыть файл.

Информация о каждой структуре CD вводится с клавиатуры, после чего структура целиком записывается на диск.



Рис. 5. Синтаксис функции fwrite() в инструкции записи структуры CD

Листинг 5. Запись структуры CD.

/*fwrite.c*/#include "stdio.h"main() { FILE *fp; struct CD { char name; char description; char category; float cost; int number; } disc; char filename; printf("Введите имя файла, который вы желаете создать: "); gets(filename); if ((fp = fopen(filename, "w")) == NULL) { printf("Невозможно открыть файл %s\n", filename); exit(); } puts("Введите сведения о диске\n"); printf("Введите название диска: "); gets(disc.name); while (strlen(disc.name) > 0) { printf("Введите описание: "); gets(disc.description); printf("Введите категорию: "); gets(disc.category); printf("Введите цену: "); scanf("%f", &disc.cost); printf("Введите номер ячейки: "); scanf("%d", &disc.number); fwrite(&disc, sizeof(disc), 1, fp); printf("Введите название: "); gets(disc.name); } fclose(fp); }

Чтение структур

Fread(&structure_variable, structure_size, number_of_structures, file_pointer);

За исключением имени функции эта инструкция полностью совпадает с записью функции fwrite(). Программа, в которой из файла считывается структура CD, приведена в Листинге 6. Для чтения данных используется цикл while:

While (fread(&disc, sizeof(disc), 1, fp) == 1)

Функция fread() возвращает значение, соответствующее количеству успешно прочитанных структур. Так как в аргументе функции мы указали, что читать следует по одной структуре, функция возвращает значение 1. Цикл while будет выполняться до тех пор, пока считывание структур с диска проходит успешно. Если чтение структуры становится невозможным, например потому, что достигнут конец файла, функция возвращает значение 0, и выполнение цикла прекращается.

Листинг 6. Чтение структуры CD с диска.

/*fread.c*/#include "stdio.h"main() { FILE *fp; struct CD { char name; char description; char category; float cost; int number; } disc; char filename; printf("Введите имя файла, который желаете открыть: "); gets(filename); if ((fp = fopen(filename, "r")) == NULL) { printf("Невозможно открыть файл %s\n", filename); exit(); } while (fread(&disc, sizeof(disc), 1, fp) == 1) { puts(disc.name); putchar("\n"); puts(disc.description); putchar("\n"); puts(disc.category); putchar("\n"); printf("%f", disc.cost); putchar("\n"); printf("%d", disc.number); } fclose(fp); }

В табл. 1 собраны все описанные способы ввода и вывода данных и показаны значения, которые возвращает каждая функция при невозможности продолжения чтения или записи данных.

Таблица 1. Функции ввода в файл и вывода из файла.

Чтение в массив

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

В Листинге 7 приведен текст программы, осуществляющей чтение информации из файла, содержащего данные о коллекции компакт-дисков, в массив структур CD (предполагается, что их количество не превышает 20). Индекс используется для того, чтобы каждая считанная из файла структура сохранялась в отдельном элементе массива disc. После того как очередная структура прочитана и выведена на экран, стоимость очередного диска добавляется к сумме, отражающей общую стоимость коллекции, а значение индекса и счетчика увеличивается за счет выполнения следующих инструкций:

Total = total + disc.cost;index++;count++;

Если бы нас интересовала только информация об общей стоимости и количестве экземпляров коллекции, можно было бы читать данные в структурную переменную, не используя массив, и просто подсчитывать значения переменных total и count. Однако если данные будут считаны в массив, вы сможете произвольным образом обращаться к структурам и печатать любую информацию.

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

Листинг 7. Чтение структуры в массив.

/*rarray.c*/#include "stdio.h"main() { FILE *fp; struct CD { char name; char description; char category; float cost; int number; } disc; int index, count; float total; count = 0; total = 0; char filename; printf("Введите имя файла данных: "); gets(filename); while ((fp = fopen(filename, "r")) == NULL) { printf("Невозможно открыть файл %s\n", filename); printf("Введите имя файла данных: "); gets(filename); } index = 0; while (fread(&disc, sizeof(disc), 1, fp) == 1) { puts(disc.name); putchar("\n"); puts(disc.description); putchar("\n"); puts(disc.category); putchar("\n"); printf("%f", disc.cost); putchar("\n"); printf("%d", disc.number); total = total + disc.cost; index++; count++; } fclose(fp); printf("Общая стоимость коллекции составляет %.2f\n", total); printf("Коллекция содержит %.d дисков\n", count); }

Листинг 8. Программа копирования содержимого файлов.

/*filecopy.c*/#include "stdio.h"main() { FILE *fp1, *fp2; char infile, outfile; int letter; printf("Введите имя файла для чтения: "); gets(infile); if ((fp1 = fopen(infile, "r")) == NULL) { printf("Невозможно открыть файл %s", infile); exit(); } printf("Введите имя файла для записи: "); gets(outfile); if ((fp2 = fopen(infile, "w")) == NULL) { printf("Невозможно открыть файл %s", outfile); fclose(fp1); exit(); } while ((letter = fgetc(fp1)) != EOF) { putchar(letter); fputc(letter, fp2); } fclose(fp1); fclose(fp2); }

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


Рис. 6. Функция fprintf() записывает числовые значения в виде текстовых символов

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

Функция fprintf() записывает все данные в виде текста. Например, если использовать fprintf() для записи числа 34.23 на диск, пять символов будут записаны так, как это показано на рис. 6. Если в дальнейшем для чтения данных из файла используется функция fscanf(), символы будут преобразованы в числовое значение и в таком виде записаны в переменную.

Вследствие того, что функция fprintf() записывает данные в виде текста, чтение из файла можно осуществлять и с помощью функций getc(), fgetc() или fgets(). Однако эти функции будут читать информацию в виде «печатных» символов. Например, если использовать функцию fgets(), числа будут считываться в виде символов, являющихся частью строки. При отображении на экране или печати на принтере данных, прочитанных с использованием функции fgets() или fgetc(), вы будете лишены возможности выполнения арифметических операций над отдельными элементами данных.

Двоичный формат

Для сохранения числовых переменных в двоичном формате используется функция fwrite(). Записанные таким образом данные на диске займут столько же места, сколько и в памяти. Если просмотреть содержимое такого файла с помощью команды TYPE, мы увидим на месте числовых значений бессмысленные буквы и значки. Это ASCII-символы, эквивалентные записанным в файл значениям.

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

Печать данных

С технической точки зрения вывести данные на принтер можно с помощью любой функции вывода: посимвольно, построчно, форматированными строками или структурами. Единственное, что необходимо, - это указать имя файла "prn" и режим доступа "w".

Однако «поструктурная» печать с помощью функции fwrite() практически не используется, так как числовые данные при этом будут напечатаны в двоичном формате в виде загадочных символов. Вместо этого для печати структур используется функция fprintf(), как это показано в Листинге 9. В этой программе открываются два файла: дисковый файл открывается для чтения, а файл принтера - для вывода.

Листинг 9. Чтение и печать содержимого дискового файла.

Каждая структура целиком вводится функцией fread(), после чего отдельные члены структуры печатаются с использованием функции fprintf(). Функция fread() может читать строки, включающие пробелы, поэтому ее применение предпочтительнее, чем использование функции fscanf().

Инструкции

Fprintf(ptr, "\n\n");

выводят по две пустые строки между отдельными структурами CD.

Проектирование программы

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

Например, вам может понадобиться просмотреть дисковый файл в поисках определенной записи. В этом случае следует открыть файл с режимом доступа "r", а потом использовать цикл для постепенного ввода данных, структура за структурой или строка за строкой в зависимости от того, к какому типу относится информация, записанная в файл. Во время каждого прохождения цикла значения вводимых данных сравниваются с искомыми. Для проверки значений строк используйте функцию strcmp(), конечно, если ваш компилятор это позволяет. Как только искомые данные найдены, они выводятся на экран, после чего файл закрывается.



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows