
- •Оглавление
- •1 Простейшее Win32 приложение
- •2 Функция WinMain
- •3 Оконный класс
- •4 Стили класса, стили окна
- •5 Создание экземпляра оконного класса
- •6 Динамические изменения свойств оконного класса
- •7 Обработка сообщений
- •8 Программирование клавиатуры
- •9 Коды oem, ansii, asci, виртуальные коды клавиш
- •10 Символьные сообщения
- •11 Обработка сообщений от мыши
- •12 Программирование таймера
- •13 Диалоговые окна
- •14 Структура шаблона диалога
- •14(А) Ресурсы диалога
- •15 Функции создания диалога
- •16 Взаимодействие между элементами управления
- •17 Сообщения, SendMessage, SendDlgItemMessage
- •18 Обработка сообщений от элементов диалога
- •19 Элемент «Слайдер» (Румянцев - Азбука программирования в Win32 api, c.148)
- •20 Элемент ProgressBar (Румянцев - Азбука программирования в Win32 api, c.156)
- •21 Bios (общие сведения)
- •22 Файлы (общие сведения)
- •23 Создание файла (Win32 api)
- •24 Операции с файлом (Win32 api)
- •25 Организация файлов
- •26 Файловые системы (общие сведения)
- •Создание файла.
- •Удаление файла.
- •28 Структура логического диска под fat12 (wfat)
- •29 Каталоги в fat12
- •30 Алгоритм определения расположения файлов на диске
- •31 Ф.С. Fat32 (отличительные особенности)
- •32 Изменение элементов системных объектов при выполнении copy
- •33 Ntfs (общие сведения)
- •34 Запись файла в mft
- •35 Метафайлы
- •36 Атрибуты записи файла
- •37 Изменение системных данных при выполнении copy
- •38 Изменение системных данных при выполнении del
- •39 Изменение системных данных при выполнении move
- •40 Процессы. Потоки. Общие сведения
- •41 Модель процесса
- •42 Контекст процесса
- •43 Дескриптор процесса
- •44 Создание процесса (общие сведения)
- •45 Окончание процесса (общие сведения)
- •46 Состояния процесса
- •47 Уровни планирования процессов
- •48 Диспетчеризация процессов
- •49 Класс приоритета процесса
- •50 Создание процесса (Win32 api)
- •51 Win32 Api. Управление процессами
- •52 Win32 Api. Окончание процесса
- •53 Среда процесса
- •54 Командная строка процесса
- •55 Наследование дочерними процессами ресурсов родителя
- •56 Список процессов
- •57 Время выполнения процесса
Создание файла.
ОС просматривает каталог, в котором нужно создать файл, и ищет, нет ли уже файла с таким именем - в папке не должно быть файлов с одинаковыми именами. Попутно она ищет первый свободный элемент каталога - может быть, есть удалённый файл, описатель которого можно занять. Если такого нет, то придётся расширять каталог. В описатель записывается имя файла, его атрибуты, время создания, размер - 0. Кластер этому файлу не выделяется, в номер первого кластера записывается 0, чего не может быть у файла с данными.
Удаление файла.
Как вы думаете, удаляется ли что-то с диска при удалении файла? Правильно, нет. ОС просто помечает файл как удалённый (первую букву его имени заменяет на 'х'), и проходит в FAT по его цепочке кластеров, помечая каждый как свободный. Если в эти кластеры ничего не будут записывать, то вся информация файла сохраняется на диске (надо только её найти).
Потери на остатках кластеров.
Как вы заметили, ОС меряет дисковое пространство только кластерами, не размениваясь на что-то меньшее. Поэтому даже самому маленькому файлу выделяется один кластер. Если файл имеет размер один байт, то только один байт из всего кластера содержит что-то полезное. Остальная часть кластера просто теряется. Да и с большими файлами то же самое. Если размер файла не кратен размеру кластера, то последний кластер файла заполнен только частично, и какая-то его часть теряется. Сколько же места займут 100 файлов по 2 байта? На кластере 4 Кб - 400 Кб (а не 200 байт, как считается), на кластере 16 Кб - 1,56 Мб. Чем меньше кластер, тем меньше дискового места теряется. Но зато растет таблица FAT. Как плохо. Отсюда вывод - система FAT любит только большие файлы, а ещё больше кратные размеру кластера. Неким стандартом размера кластера является 4 килобайта - посчитали, что на нём меньше всего теряется места. Но если у вас на диске будет много маленьких файлов, делайте кластер меньше, и вы выиграете.
28 Структура логического диска под fat12 (wfat)
Логический диск с системой FAT состоит из системной области и области файлов. Каждая часть логического диска занимает целое число логических секторов.
Секторы области файлов объединены в кластеры, размер кластера 1, 2, 4, 8, 16, 32 или 64 сектора по 512 байт. Номер первого кластера равен 2, так как первые две ячейки FAT зарезервированы (содержат байт-описатель).
На рисунке приведена структура логического диска для файловой системы FAT12:
Сектор 0, называемый также начальным
загрузчиком, содержит таблицу параметров
диска и начальный загрузчик операционной
системы. Первые 3 байта сектора 0 содержат
команду перехода JMP на начало загрузчика:
либо байт 0E9h и 1 байт короткого смещения,
за которым следует команда NOP (код 90h),
либо байт 0EBh и два байта длинного
смещения. Длинное смещение используется,
если загрузчик располагается в
зарезервированных секторах.
Далее
расположено поле из 8 бит, в которое при
форматировании заносится идентификатор
версии ОС. Это текстовая строка, имеющая
значение MSWIN4.1 для ОС Windows.
Далее
располагается таблица BPB (BIOS parameter block),
описывающая физические характеристики
диска и позволяющая вычислить правильный
физический адрес на диске по данному
номеру логического сектора. За таблицей
располагаются дополнительные данные.
За
сектором 0 могут быть расположены
дополнительные зарезервированные (для
загрузчика) секторы. Общее число
зарезервированных секторов, включая
сектор 0, указывается в BPB.
Таблица BPB для FAT12 содержит следующие характеристики диска:
Смещение в секторе |
Размер |
Содержание |
0Bh |
2 |
Число байтов в секторе (всегда 512) |
0Dh |
1 |
Число секторов в кластере |
0Eh |
2 |
Размер системной области (включая этот сектор) |
10h |
1 |
Число таблиц FAT (чаще всего 2) |
11h |
2 |
Число описателей файлов в корневом каталоге (в FAT32 - 0) |
13h |
2 |
Общее число секторов на диске (если 0, то размер - в поле со смещением 20h) |
15h |
1 |
Тип устройства |
16h |
2 |
Размер одной FAT в секторах (0 в FAT32) |
18h |
2 |
Число секторов на дорожке |
1Ah |
2 |
Число головок |
1Ch |
4 |
Абсолютный номер этого сектора |
20h |
4 |
Размер диска в секторах |
За таблицей BPB расположена дополнительная информация для операционной системы:
Смещение |
Размер |
Содержимое |
24h |
1 |
Номер дисковода для функций BIOS |
25h |
1 |
Зарезервировано |
26h |
1 |
Сигнатура - 29h |
27h |
4 |
Дата/время создания диска |
2Bh |
11 |
Метка диска - текстовая строка |
36h |
8 |
Аббревиатура файловой системы |
Физический номер диска для жестких дисков начинается с 80h.
Серийный номер тома - это шестнадцатеричное псевдослучайное число, предназначенное для того, чтобы ОС могла проверять смену пользователем дискета, когда он еще используется, но на самом деле такой проверки не делается.
Метка тома - это строка, предназначенная для идентификации тома пользователем.
Описатель FAT нельзя рассматривать как идентификатор файловой системы.
Далее с адреса 03Eh расположен начальный загрузчик.
Последние два байта сектора 0 содержат признак загрузочной записи - байт 55h по адресу 1FEh и байт AAh по адресу 1FFh (его можно рассматривать как слово AA55h по адресу 1FEh).
За зарезервированными секторами (или непосредственно за сектором 0) располагается таблица размещения файлов (на рисунке FAT-1), после которой могут располагаться дополнительные копии FAT. Обычно используется 2 копии. Число копий указано в BPB.
Все файлы и папки содержатся в кластерах. Папка – это тот же файл, в котором установлен атрибут каталога и содержатся ссылки на файлы и другие папки, “содержащиеся” в нём. В элементе FAT, соответствующем кластеру файла, содержится номер следующего кластера файла, или специальное значение, сигнализирующее, что файл закончен. Таким образом, для чтения всего файла нужно знать только номер его первого кластера, который и находится в описателе файла в папке, содержащей его. Мы читаем первый кластер, затем смотрим в таблице FAT номер следующего кластера, считываем его, и так далее, пока не встретим значение “конец файла” (равно –1 в системах Microsoft).
Номер элемента FAT |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
Содержимое элемента |
26 |
0 |
23 |
24 |
25 |
-1 |
776 |
|
|
Свободный кластер |
Начало файла |
|
|
Последний кластер файла |
|
На рисунке показан фрагмент таблицы FAT, в котором показано расположение файла с первым кластером 22. Для простоты, файл находится в смежных кластерах. При запросе на чтение файла ОС найдёт в папке ссылку на этот файл и прочитает кластеры с 22 по 25.
В конце системной области расположен корневой каталог, который имеет фиксированный размер. Размер корневого каталога в каталожных записях также указан в таблице BPB. Поскольку загрузочная запись слишком мала для хранения алгоритма поиска системных файлов на диске, то системные файлы должны находиться в определенном месте, чтобы загрузочная запись могла их найти. Фиксированное положение системных файлов в начале области данных накладывает жесткое ограничение на размеры корневого каталога и таблицы размещения файлов. Вследствие этого общее число файлов и подкаталогов в корневом каталоге на диске FAT ограничено 512.
Каждому файлу и подкаталогу в FAT соответствует 32-байтный элемент каталога (directory entry), содержащий имя файла, его атрибуты (архивный, скрытый, системный и “только для чтения”), дату и время создания (или внесения в него последних изменений), а также прочую информацию (табл. 3).
Содержание |
Размер (байт) |
Имя файла |
8 |
Расширение |
3 |
Байт атрибутов |
1 |
Зарезервировано |
10 |
Время |
2 |
Дата |
2 |
Номер начального кластера с данными |
2 |
Размер файла |
4 |
Табл. 3. Элемент каталога
Файловая система FAT всегда заполняет свободное место на диске последовательно от начала к концу. При создании нового файла или увеличении уже существующего она ищет самый первый свободный кластер в таблице размещения файлов. Если в процессе работы одни файлы были удалены, а другие изменились в размере, то появляющиеся в результате пустые кластеры будут рассеяны по диску. Если кластеры, содержащие данные файла, расположены не подряд, то файл оказывается фрагментированным. Сильно фрагментированные файлы значительно снижают эффективность работы, так как головки чтения/записи при поиске очередной записи файла должны будут перемещаться от одной области диска к другой. В состав операционных систем, поддерживающих FAT, обычно входят специальные утилиты дефрагментации диска, предназначенные повысить производительность файловых операций.