На этом шаге мы рассмотрим общие характеристики файлов.
Атрибуты файла
Временные характеристики
Длина файла
Имя
Работа с файлами - важнейшая образующая практически любой программы. С появлением скоростных дисков больших объемов значение файлов сильно возросло. Использование API-функций управления файлами может сделать вашу программу более эффективной и производительной. Большинство программ последующих шагов являются консольными, потому что консольная программа как никакая другая подходит для демонстрации файловой обработки.
На этом шаге мы приведем описание характеристик файлов, основываясь на параметрах , которыми манипулируют функции API. О типах и структуре файловых систем речь пойдет далее.
Размер - DWORD.
Смену атрибута можно осуществить функцией SetFileAttributes, получить значение атрибута функцией GetFileAttributes. Следует заметить, что если операционная система не накладывает никаких ограничений на возможности изменения атрибутов файлов, то обесценивается смысл самих атрибутов - всегда можно снять атрибут "только чтение" и делать с файлом, что| заблагорассудится.
Файл имеет три временные характеристики:
Время отсчитывается в наносекундных интервалах начиная с 12:00 пополудни 1 января 1600 года и хранится в двух 32-битных величинах. Надо сказать, что время хранится в так называемых универсальных координатах и должно еще быть преобразовано в локальное время (функция FileTimeToLocalFileTime). Получить значение, всех трех времен можно функцией GetFileTime.
Длина файла в байтах хранится обычно в двух 32-битных величинах либо в одной 64-битной величине. Если 32-битные величины обозначить как 11 (младшая часть) и 12 (старшая часть), то 64-битная величина выразится формулой 12 * 0FFFFH + 11. Размер файла можно получить функцией GetFileSize.
Кроме указанных характеристик, файл, разумеется, имеет имя. При этом мы будем различать длинное и короткое имя. Точно так же будем различать полный путь (со всеми длинными именами) и укороченный путь (все длинные имена заменены укороченными). Необходимость использования укороченного имени и пути диктуется, прежде всего, тем, что некоторые программы получают путь или имя на стандартный вход и трактуют пробелы как разделители для параметров. Преобразование длинного имени в короткое можно осуществить функцией GetShortPathName, которая работает и для имени, и для пути. Обратное преобразование можно осуществить функцией GetFullPathName.
Здесь мы не рассматриваем вопроса о прямом доступе к диску. Но вопрос о структуре записей каталога у читателя все же может возникнуть. Это и понятно, ведь с переходом к FAT32, во-первых, появилась возможность хранения файлов с длинным именем, во-вторых, у файла, кроме времени и даты модификации, появились еще время и дата создания и доступа. Где же все это хранится?
Для того чтобы ответить на поставленный вопрос, вспомним, что каталог в файловых системах FAT делится на записи длиной 32 байта. Ниже приводится структура записи для FAT32. Пустыми записями считаются записи, содержащие нулевые байты либо начинающиеся с кода Е5Н (для удаленных записей). На файл с обычным именем (8 байт на имя и 3 - на расширение) отводится 32 байта. В байте со смещением +11 содержится атрибут файла. Если атрибут файла равен 0FH, то система считает, что здесь содержится длинное имя. Длинное имя кодируется в Unicode и записывается в обратном порядке. За одной или несколькими записями с длинным именем должна следовать запись с обычным именем, содержащим знак ~ (тильда). Здесь содержится также остальная информация о файле. Как видите, алгоритм просмотра каталога с выявлением информации о файле весьма прост. Обратимся теперь к структуре записи каталога. В старой операционной системе MS-DOS байты с 12 по 21 никак не использовались системой. Новой системе они пригодились. В таблице 1 дана новая структура записи каталога.
Смещение | Размер | Содержание |
---|---|---|
Имя файла или каталога, выровненное на левую границу и дополненное пробелами | ||
Расширение имени файла, выровненное на левую границу и дополненное пробелами | ||
Атрибут файла | ||
Время доступа | ||
Время создания | ||
Дата создания | ||
Дата доступа | ||
Два старших байта номера первого кластера файла | ||
Время модификации файла | ||
Дата модификации файла | ||
Два младших байта номера первого кластера файла | ||
Размер файла в байтах |
Как видите, все байты 32-байтной записи каталога теперь заняты. Как можно заметить, на длину файла отводится всего 4 байта. А как найти длину файла, если на нее требуется более 4 байт? Разумеется, в этом случае следует считать, что в каталоге хранятся младшие байты длины, а полную длину легко определить, обратившись к таблице размещения файлов. Но согласитесь, что это уже явная недоработка. Странно также выглядит функция GetFileSize, которая возвращает четыре младших байта длины файла, старшие же файлы возвращаются во втором параметре функции.
Иное дело в файловой системе NTFS, поддерживаемой Windows NT, изначально планируемой для работы с файлами больших размеров. Здесь для индексации кластеров используются 64-битные поля.
Со следующего шага мы начнем рассматривать организацию поиска файлов.