Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), sizeof(dentry));
if(!(memcmp(dentry.name, sn->name, sn->name_len)) &&
!(memcmp(dentry.ext, sn->ext, sn->ext_len)))
break;
if(!dentry.name[0]) return -1;
}
return 0;
}
На этом рассмотрение модуля чтения файла с раздела FAT32 завершим.
Исходные тексты модуля находятся в каталоге FAT32, файл fat32.c.
Отличия в организации хранения записей о файлах в каталогах для файловых систем FAT и EXT2
Несколько слов об отличиях в организации хранения записей о файлах в каталогах для файловых систем FAT и EXT2. Структура файловой системы EXT2 была рассмотрена в [3].
C FAT мы только что ознакомились – в ней все элементы каталога имеют фиксированную величину. При создании файла драйвер файловой системы ищет первую незанятую позицию и заполняет её информацией о файле. Если длина каталога не умещается в одном кластере, то под него отводится ещё один кластер и т. д.
Рассмотрим, как обстоят дела в EXT2.
Предположим, у нас есть раздел с файловой системой EXT2, размер блока равен 4096 байт. На этом разделе мы создаем каталог. Размер каталога будет равен размеру блока – 4096 байт. В каталоге операционная система сразу создаёт две записи – запись текущего и запись родительского каталогов. Запись текущего каталога займет 12 байт, в то время как длина записи родительского будет равна 4084 байта. Создадим в этом каталоге какой-нибудь файл. После этого в каталоге будут присутствовать три записи – запись текущего каталога длиной 12 байт, запись родительского каталога длиной уже 12 байт, и запись созданного файла длиной, как вы наверно догадались, 4072 байт. Если мы удалим созданный файл, длина записи родительского каталога опять возрастёт до 4084 байт.
Таким образом, при создании файла драйвер файловой системы EXT2 ищет в каталоге запись максимальной длины и расщепляет её, выделяя место для новой записи. Ну, а если всё-таки места не хватает, под каталог отводится ещё один блок, и длина каталога становится равной 8192 байт.
И в заключение – небольшая правка к статье «Архитектура файловой системы EXT2» [3].
Эта правка касается функции определения номера inode по имени файла get_i_num(). Старый вариант этой функции выглядел так:
int get_i_num(char *name)
{
int i = 0, rec_len = 0;
struct ext2_dir_entry_2 dent;
for(; i < 700; i++) {
memcpy((void *)&dent, (buff + rec_len), sizeof(dent));
if(!memcmp(dent.name, name, dent.name_len)) break;
rec_len += dent.rec_len;
}
return dent.inode;
}
Исправленный вариант:
int get_i_num(char *name)
{
/*
* Параметр функции - имя файла. Возвращаемое значение - номер inode файла.
*/
int rec_len = 0;
struct ext2_dir_entry_2 dent; // эта структура описывает формат записи корневого каталога:
/*
* В глобальном буфере buff находится массив записей каталога. Для определения порядкового номера inode файла необходимо найти
* в этом массиве запись с именем этого файла. Для этого организуем цикл: