Разработка программы, реализующей функции файлового обмена (чтение, запись) с образом файловой системы FAT16
Понятие и физическая структура диска, описание способности системы хранить данные. Рассмотрение особенностей файловой системы FAT16. Выявление связи между размером кластера и потерями дискового пространства. Пример создания программы файлового обмена.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.10.2015 |
Размер файла | 146,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
Федеральное государственное автономное образовательное учреждение
высшего профессионального образования
"Санкт-Петербургский государственный университет аэрокосмического приборостроения"
Кафедра управления в технических системах
Курсовая работа
Разработка программы, реализующей функции файлового обмена (чтение, запись) с образом файловой системы FAT16
Руководитель
ст. преп. Криволапчук И.Г.
Санкт-Петербург 2014
Содержание
- Введение
- 1. Цель работы
- 2. Теоретические сведения
- 3. Разработка программы
- Заключение
- Список литературы
Введение
Информация на компьютерах, хранятся на постоянном запоминающем устройстве (ПЗУ) в виде именованных последовательностей, называемых файлами. Хранение файлов подобно хранению книг в библиотеке, и для организации доступа к ним требуется специальная система, обеспечивающая минимизацию времени доступа и удобство работы.
Файловая система представляет совокупность служебных структур на носителе и средств операционной системы, обеспечивающих манипуляцию файлами.
Файловая система FAT (File Allocation Table) была разработана Биллом Гейтсом и Марком МакДональдом в 1977 году и первоначально использовалась в операционной системе 86-DOS. Чтобы добиться переносимости программ из операционной системы CP/M в 86-DOS, в ней были сохранены ранее принятые ограничения на имена файлов. В дальнейшем 86-DOS была приобретена Microsoft и стала основой для ОС MS-DOS 1.0, выпущенной в августе 1981 года.
Система FAT 16, являющаяся основной для операционных систем DOS, Windows 95?98?Me, Windows NT?2000?XP, а также поддерживается большинством других систем. FAT 16 представляет собой простую файловую систему, разработанную для небольших дисков и простых структур каталогов.
Название происходит от названия метода организации файлов - Таблица размещения файлов (File Allocation Table). Эта таблица размещается в начале диска. Число 16 означает, что данная файловая система 16-разрядная - для адресации кластеров используется 16 разрядов. Операционная система использует Таблицу размещения файлов для поиска файла и определения кластеров, которые этот файл занимает на жестком диске. Кроме того, в Таблице фиксируются сведения о свободных и дефектных кластерах. Чтобы легче было осмыслить файловую систему FAT16, представьте себе оглавление книги и как вы работаете с этим оглавлением, вот именно также операционная система работает с FAT 16.
Каждому кластеру в FAT соответствует отдельная запись, которая показывает, свободен ли он, занят ли данными файла, или помечен как сбойный (испорченный). Если кластер занят под файл, то в соответствующей записи в таблице размещения файлов указывается адрес кластера, содержащего следующую часть файла. Из-за этого FAT называют файловой системой со связанными списками.
Оригинальная версия FAT, разработанная для DOS 1.00, использовала 12-битную таблицу размещения файлов и поддерживала разделы объемом до 16 Мб (в DOS можно создать не более двух разделов FAT). Для поддержки жестких дисков размером более 32 Мб разрядность FAT была увеличена до 16 бит, а размер кластера - до 64 секторов (32 Кб). Так как каждому кластеру может быть присвоен уникальный 16-разрядный номер, то FAT поддерживает максимально 216, или 65536 кластеров на одном томе.
1. Цель работы
Разработать программу, реализующую функции файлового обмена (чтение, запись) с образом файловой системы FAT16.
2. Теоретические сведения
Физическая структура диска
Способность дисков хранить данные основывается на использовании намагниченных участков, движение, мимо которых, считывающего устройства возбуждает в этом устройстве импульсы тока. Намагниченные и не намагниченные участки соответствуют единичному и нулевому битам информации, хранящейся на диске. Но не они являются единицами распределения дискового пространства.
Рисунок 1. Дорожки (цилиндры)
Жесткие диски состоят из одной или более дисковых пластин, у которых для хранения используется одна или обе стороны. Данные записываются на магнитной поверхности стороны диска в виде концентрических окружностей, называемых дорожками (рис. 1). Каждая дорожка состоит из нескольких секторов (рис. 2). Размер сектора и их количество на дорожке задается при форматировании. Именно сектор является единицей разбиения дискового пространства.
Для доступа к сектору необходимо указать его местоположение на диске, т.е. его адрес. Это может делаться двумя способами.
Первый из способов заключается в указании номера дорожки (иногда называемого номером цилиндра), номера стороны (головки), и номера сектора. Второй способ состоит в сквозной последовательной нумерации секторов от края диска к центру. Эта нумерация начинается с самой внешней дорожки 0, стороны 0, сектора 1 (нумерация дорожек и сторон начинается с 0, а секторов с 1), затем продолжается вдоль дорожки по нарастанию номеров секторов. диск файловый кластер программа
После прохождения на дорожке сектора с наибольшим номером, следующим становится сектор с номером дорожки 0, номером стороны 1 и номером сектора 1, т.е. счет секторов продолжается по возрастанию сторон. Переход на следующую дорожку осуществляется не раньше, чем пронумерованы все сектора на всех сторонах текущей дорожки.
Логическая структура жёстких дисков
Логическая структура жёсткого диска предполагает деление общего дискового пространства на области, каждая из которых хранит специфическую информацию: MBR (Master Boot Record), BR (Boot Record), FAT1 и FAT2, Root Directory и область для данных.
MBR-это главный загрузочный сектор, это первый сектор на диске, с чтения его содержимого начинается работа компьютера при включении или перезагрузке. MBR состоит из двух частей: в первой части записана программа IPL1- Initial Program Loading 1, при выполнении которой компьютер исследует содержимое второй части MBR- таблицу разделов диска Partition Table, в которой указаны номера первого и последнего секторов каждого из разделов диска.
Количество разделов может быть от 1 до 4-х, когда диск условно разделён на 4 логических диска. В Partition Table также хранится информация о типе файловой системы раздела и признак того - является раздел загрузочным или нет. Каждый из разделов жёсткого диска содержит сектор BR (Boot Record), две копии File Allocation Table (FAT) - FAT1 и FAT2, корневой каталог Root Directory и область данных.
Сектор BR (Boot Record) - это первый сектор раздела, в котором записана одноимённая программа Boot Record, являющаяся частью операционной системы и предназначенная для запуска на выполнение остальных программ операционной системы, хранящихся на диске. BR имеется во всех разделах жёсткого диска, хотя не все разделы содержат файлы операционной системы, т.е. не все разделы являются "системными".
Таблица FAT (File Allocation Table) - таблица размещения файлов, хранит записи длиной 16 или 32 бита, хранящие информацию о месторасположении кластеров, на которых записан каждый файл. Если FAT повреждается, то компьютер теряет доступ к файлу и на диске появляются "потерянные кластеры" - т.е. секторы с бесполезной информацией, которую невозможно прочесть.
Root Directory - корневой каталог диска, содержит записи с информацией о каждом файле - имя, тип, объём, дата и время создания, атрибут файла (системный, скрытый, только для чтения, архивный) и хранит указатель на первый кластер файла. Корневой каталог является самым "главным" каталогом в разделе диска, все остальные каталоги и файлы располагаются по иерархии ниже его.
Data Area - область для данных - основная область раздела диска, хранит сами файлы.
Физическая и логическая структуры жёсткого диска создаются в процессе форматирования. В отличие от дискет, процесс форматирования жёсткого диска разбит на 2 этапа - низкоуровневое форматирование и форматирование высокого уровня. Низкоуровневое форматирование выполняется один раз на заводе-изготовителе. Форматирование высокого уровня выполняется утилитой Format.exe, хранящейся на загрузочной дискете, либо соответствующими средствами Windows.
3. Разработка программы
//---------------------------------------------------------------------------
#include <stdio.h>
#pragma hdrstop
#include <fcntl.h>
//---------------------------------------------------------------------------
#pragma argsused
//Задаем переменные:
//int,short - целочисленные, char - символьные,
int f;
int data , sdv;
struct { //Структура загрузочных переменных
char jmp[3];
char oem[8];
short sect_siz;
char clust_siz;
short res_sect;
char fat_cnt;
short root_siz;
short tot_sect;
char media;
short fat_siz;
short sectors;
short heads;
short hidden_1;
short hidden_h;
int tot_secs;
char fiz_disk;
char reserved_1;
char symbol;
int s_nom;
char v_lable[11];
char reserved_2[8];
}boot ; //Окончание структуры, название: boot
unsigned short rez [32768]; //Размер 16 bit, целочисленная
struct{ //Структура переменных для файлов
char name[8]; //Имя файла
char rs[3];
char atribut;
char reserv[10];
short time; //Время создания
short date; //Дата создания
short nkl; //Номер первого кластера файла
int size; //Размер файла
}dir[1024]; //Окончание структуры, название dir,вместимость 1024
struct{ //Структура для файлов
char name[8]; //Имя файла
char rs[3];
char atribut;
char reserv[10];
short time; //Время создания
short date; //Дата создания
short nkl; //Номер первого кластера файла
int size; //Размер файла
int clust; //Кол. кластеров
int file; //Сам фаил
}files[1024];
int root_pos;
int fat_pos ;
int kat_siz ; //Размер каталога
int data_start ; //Начало области файлов
int tot_siz ; //Размер диска в байтах
int data_siz ; //Байтов под файлы
int fat_tot_siz ; //Байтов под фаты
int clust_b_siz ; //Байтов в кластере
int clust_data ; //Кластеров под файлы
int main(int argc, char* argv[]) //Условная переменная
{ int i,k,n,j;
if(argc !=2){//Сравнение двух аргументов, при совпадении
printf("usage: program image \n"); //Использовать програмное изображение
getch();//Ожидаем нажатие клавиши, и
exit(0);} //Выход (для того, чтоб не было ошибок)
f= open(argv[1], O_RDONLY|O_BINARY); //только для чтения
//в бинарном коде
if(f<0){ //если не удалось открыть
printf("error opening file \n");
getch();//Ошибка и ожидает нажатия для выхода
exit(0);}
printf("Hello Neo... \n"); //Приветствие =)
getch();
clrscr(); //Отчистка приветствия
printf("boot parametrs: \n");//Заголовок параметры
printf("\n"); //Пропуск строки
read (f,&boot, sizeof(boot));//Считать f в boot
//Размер считывания размер boot в двоичном коде
printf("oem: %.8s\n", boot.oem);//Автор
printf("sect_siz: %d\n", boot.sect_siz); //Байтов в секторе диска
printf("clust_siz: %d\n", boot.clust_siz); //Сектаров в кластере
printf("res_sect: %d\n", boot.res_sect);//Зарезервированных секторов
printf("fat_cnt: %d\n", boot.fat_cnt); //Таблиц фат
printf("root_siz: %d\n", boot.root_siz);//Максимум файлов в каталоге
printf("tot_sect: %d\n", boot.tot_sect);//Всего секторов
printf("media: %d\n", boot.media); //Среда носителя
printf("fat_size: %d\n", boot.fat_siz);//Секторов на одну копию Fat
printf("sectors: %d\n", boot.sectors); //Секторов на дорожке
printf("heads: %d\n", boot.heads); //Сторон(головок)
printf("hidden_1: %d\n", boot.hidden_1);//Скрытых секторов раздела, меньше 32 мБайт
printf("hidden_h: %d\n", boot.hidden_h);//Скрытых секторов раздела, больше 32 мБайт
printf("tot_secs: %d\n", boot.tot_secs);//Секторов для раздела на логическом д. больше 32 мБайт
printf("fiz_disk: %d\n", boot.fiz_disk);//Физический номер диска
printf("reserved_1: %d\n", boot.reserved_1);//Зарезервированно
printf("symbol: %d\n", boot.symbol);//Тип загрузочной записи
printf("s_nom: %d\n", boot.s_nom);//Серийный номер диска
printf("v_lable: %d\n", boot.v_lable);//Метка диска
printf("reserved_2: %d\n", boot.reserved_2);//Зарезервировано, обозначение формата
getch();
printf("\n");//Пропуск строки
printf("Match: \n"); //Заголовок
getch();
printf("\n");//Пропуск строки
tot_siz = (boot.tot_sect * boot.sect_siz);//Размер диска в байтах
printf("Tot_siz: %d\n", tot_siz);
root_pos = (boot.fat_siz * boot.fat_cnt + boot.res_sect)* boot.sect_siz;
printf("root_pos: %d\n", root_pos); //Байтов на фаты и резерв
fat_pos = (boot.res_sect * boot.sect_siz);
printf("fat_pos: %d\n", fat_pos); //Байтов на резерв
fat_tot_siz = (root_pos - fat_pos);
printf("Fat_tot_siz: %d\n", fat_tot_siz); //Байтов на таблицы фат
kat_siz = (boot.root_siz * 32);
printf("Kat_siz: %d\n", kat_siz); //Размер каталога
data_start = (root_pos + kat_siz);//Область начала файлов
printf("Data_start: %d\n", data_start);
data_siz = (tot_siz - data_start);//Байтов под файлы
printf("Data_siz: %d\n", data_siz);
data_siz = (tot_siz - data_start);//Байтов под файлы
printf("Data_siz: %d\n", data_siz);
clust_b_siz = (boot.clust_siz * boot.sect_siz);//Байтов в кластере
printf("Clust_b_siz: %d\n", clust_b_siz);
clust_b_siz = (boot.clust_siz * boot.sect_siz);//Байтов в кластере
printf("Clust_b_siz: %d\n", clust_b_siz);
clust_data = (data_siz /clust_b_siz);//Кластеров под файлы
printf("Clust_data: %d\n", clust_data);
getch();
printf("\n");//Пропуск строки
printf("Read katalog... \n");
getch();
printf("\n");//Пропуск строки
lseek(f, fat_pos, SEEK_SET); //Смещение от начала на
// fat_pos(количество резервных), от начала
read (f, rez, fat_tot_siz);
//Считываем f в rez размером boot.fat_size * boot.sect_size
// т.е. размер одного FAT, значит записываем FAT(талицу) в rez
lseek(f, root_pos, SEEK_SET); //Смещение от начала на
//root_pos (размер фатов + резерв)
read (f, dir, kat_siz);//Считываем f в dir
//с отступом в root_pos, считываем корневой каталог (размером 32 байта)
lseek(f, data_start, SEEK_SET); //Смещение от начала на
// data_start(начало файлов), от начала
read (f, data, data_siz);//Считываем в Data файловую область
j = 0;
for(i=0; i<boot.root_siz;i++){ //Счет от 0 до максимального количества файлов
if ((dir[i].name[0]!=0) &&(dir[i].atribut!=0x0f) //&& (dir[i].name[0]!=(char)0xe5)
){ //Сделанно чтоб выводил битый
//Определяем имя: значение не равно 0, не равно 0xe5 (свбодный)
//А атрибут файла не 0x0f
//Если уберем значение 0xe5 то будет выводить битые
printf("name: %.8s", dir[i].name);//Печатем имя файла
printf(" extension file: %.3s", dir[i].rs);//Печатем расширение
printf(" size: %d\n", dir[i].size);//Печатаем размер
printf(" nkl: %d\n", dir[i].nkl);//Номер первого кластера файла
for (k = dir[i].nkl , n = 0 ; k < 0xfff0 ; k = rez[k] , n++ ) {
printf(" K : %d\n", k );//Выводим все номера кластеров
}
printf(" takes clusters: %d\n", n );
//Выводим сколько занято кластеров файлом
printf("date: %02d.%02d.%04d\n", dir[i].date&0x1f, (dir[i].date&0x1e0)>>5, 1980+((dir[i].date&0xf800)>>9));
//Выводим дату
printf("time: %02d:%02d:%02d", (dir[i].time&0xf800)>>11, (dir[i].time&0x7e)>>5, dir[i].time&0x01f);
//Выводим время
printf(" \n\n");//Пропуск строки
//Далее выполняем чтение в структуру Files найденных файлов
files[j].time = dir[i].time;
files[j].date = dir[i].date;
files[j].nkl = dir[i].nkl;
files[j].size = dir[i].size;
files[j].atribut = dir[i].atribut;
j = j + 1;
}
}
getch();
return 0;
}
//---------------------------------------------------------------------------
Заключение
В файловой системе FAT16 под номер кластера отведено 16 разрядов. Поэтому максимальное количество кластеров составляет 65525, а максимальный размер кластера 128 секторов. В таком случае максимальный размер разделов или дисков в FAT16 составляет 4,2 гигабайта. При логическом форматировании диска или раздела операционная система старается использовать минимальный размер кластера, при котором получающееся количество кластеров не превышает 65525. Очевидно, что чем больше размер раздела, тем больше должен быть размер кластера. Многие операционные системы неправильно работают с кластером размером в 128 секторов.
В результате максимальный размер раздела FAT16 уменьшается до 2 гигабайт. Обычно чем больше размер кластера, тем больше становятся потери дискового пространства. Это связано с тем, что последний кластер, занимаемый файлом, заполнен лишь частично. Например, если файл размером 17 Кбайт записывается в раздел с размером кластера 16 Кбайт, то этот файл займет два кластера, причем первый кластер будет заполнен полностью, а во втором кластере будет записан только 1 Кбайт данных, а остальные 15 Кбайт пространства второго кластера останутся не заполненными и будут недоступными для записи других файлов. Если на больших дисках записывается большое количество маленьких файлов, то потери дискового пространства будут значительны.
Чтобы прочитать файл, операционная система должна найти по имени файла запись в папке и прочитать номер первого кластера файла. Первый кластер представляет собой начало файла. Затем необходимо прочитать соответствующий первому кластеру файла элемент FAT. Если элемент содержит метку - последний в цепочке, то дальше ни чего искать не нужно: весь файл умещается в одном кластере. Если кластер не последний, то элемент таблицы содержит номер следующего кластера. Содержимое следующего кластера должно быть прочитано вслед за первым. Когда будет найден последний кластер в цепочке, то, если файл не занимает весь кластер целиком, необходимо отсечь лишние байты кластера. Лишние байты отсекаются по длине файла, хранящейся в записи папки.
Чтобы записать файл, операционная система должна выполнить следующую последовательность действий. В свободном элементе папки создается описание файла, затем ищется свободный элемент FAT, и ссылка на него размещается в записи папки. Занимается первый кластер, описываемый найденным элементом FAT. В этот элемент FAT помещается номер следующего кластера или признак последнего кластера в цепочке.
Операционная система действует таким образом, чтобы собирать цепочки из соседних кластеров по нарастанию номера. Понятно, что обращение к последовательно расположенным кластерам будет происходить значительно быстрее, чем к кластерам, случайным образом, разбросанным по диску. При этом игнорируются уже занятые и помеченные в FAT как дефектные кластеры.
Список литературы
1. Барри Саймон. Файловая система FAT32 для Windows 95. PC Magazine, Апрель 8, 1997, стр. 279.
2. Хелен Кастер. Основы Windows NT и NTFS / Пер. с англ. -- М: Издательский отдел "Русская редакция" ТОО "Channel Trading Ltd.", 1996. -- 440 с.
3. Ресурсы Windows NT: пер. с англ. -- СПб.: BHV -- Санкт-Петербург, 1996. -- 720 с.
4. Фролов А.В., Фролов Г.В. Программирование для Windows NT. -- М.: ДИАЛОГ-МИФИ, 1996. - 272 с. Т. 26.
5. Фролов А.В., Фролов Г.В. Программирование для Windows NT. -- М.: ДИАЛОГ-МИФИ, 1997. - 271 с. Т. 27.
6. Нортон П. Персональный компьютер фирмы IBM и операционная система MS-DOS: Пер. с англ. -- М.: Радио и связь, 1991. С. 416.
Размещено на Allbest.ru
Подобные документы
Физическая и логическая структура жёстких дисков персонального компьютера. Методы организации файлов. Процесс форматирования жёсткого диска. Разработка программы, реализующей функции файлового обмена, чтения и записи с образом файловой системы FAT16.
курсовая работа [166,3 K], добавлен 09.06.2015Основное назначение файловой системы как эффективное решение задачи. История создания и общая характеристика файловой системы FAT. Характеристика файловых систем FAT16 и FAT32 и их сравнение. Альтернативная файловая система NTFS и её сравнение с FAT32.
реферат [27,2 K], добавлен 01.12.2014Определение файловой системы. Виртуальные и сетевые файловые системы. Структура и версии системы FAT. Определение максимального размера кластера. Драйверы файловой системы, файлы и каталоги. Способы доступа к файлам, находящимся на удаленном компьютере.
доклад [29,2 K], добавлен 11.12.2010Понятие сектора. Обобщенная структура диска с FAT. Расчет емкости диска с ФС FAT. Требования к файловой системе высокого уровня. Структура тома NTFS. MFT – главная файловая таблица. Номера кластеров, адреса, отрезки. Резидентные атрибуты файловой записи.
презентация [68,4 K], добавлен 20.12.2013Предназначение дисковых накопителей, схема устройства жесткого диска. Критерии эффективности физической организации файлов. Схема адресации кластеров файла, используемая в стандартной на сегодняшний день для UNIX файловой системе ufs. Функции флэш-памяти.
реферат [4,0 M], добавлен 09.12.2009FAT - простая файловая система, разработанная для небольших дисков и простых структур каталогов. Структура папки FAT. Размеры кластеров по умолчанию для FAT16 и FAT32. Сравнение их характеристик. Обзор файловой системы FAT и ее основные преимущества.
статья [24,2 K], добавлен 30.04.2010Анализ программы "Проводник". Понятие операционной системы (ОС). Достоинства и недостатки файловых систем. Исследование методов запуска программы "Проводник", работа с файловой структурой в программе "Проводник" ОС Windows. Приемы работы с объектами.
курсовая работа [32,7 K], добавлен 13.09.2009Особенности и принцип действия файловой системы NTFS - одной из самых сложных и удачных из существующих на данный момент файловых систем. Функции файловой системы NTFS: разреженные файлы, журнал изменений, компрессия файлов и каталогов, жесткие связи.
реферат [17,4 K], добавлен 24.12.2010Разработка программы для отображения текущих значений полей файлового и необязательного заголовков и предоставление возможности изменения значений. Реализация файлового заголовка COFF для Windows поля и каталоги данных (адреса и размеры таблиц).
курсовая работа [18,9 K], добавлен 23.06.2011Принципы программирования файловой структуры в операционной системе Windows. Свойства и методы класса Tstream. Пример создания, чтения и записи потока. Чтение, запись и внутренняя структура файла. Пример чтения из файла, начиная с заданной позиции.
курсовая работа [251,6 K], добавлен 18.05.2011