Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

spo_2 / other / Лаб_спо1

.doc
Скачиваний:
25
Добавлен:
27.05.2013
Размер:
68.99 Кб
Скачать

buff[$20*i+27] := lo(nachklast);{Начальный кластер}

buff[$20*i+28] := hi(nachklast);{ данных }

buff[$20*i+29]:= lo( v mod 65536);{Размер }

buff[$20*i+30]:= hi( v mod 65536);{ файла }

buff[$20*i+31]:= lo(v div 65536); { в }

buff[$20*i+32]:= hi(v div 65536); { байтах}

asm

mov ax,0

mov dx,noklasteraoglav {Сохраняем изменения}

mov cx,1 { в кластере }

mov bx,offset buff;

int 26h

pop dx

end;

j:=1;

repeat {Корректируем FAT}

if j = razm then FAT[nachklast+1]:=4095 {Если конец цепочки}

else

begin

FAT[nachklast+1]:= nachklast+1; {Ссылка на следующий элемент}

inc(nachklast); {FAT}

end;

j:=j+1;

until(j> razm);

writeln('Файл создан! ');

end

else

writeln('Нет места для создания файла в корневом каталоге');

end

else

writeln('Нет места!');

end

else

writeln('Неверный второй параметр!');

end

else

writeln('Нет параметров');

i:=1;

j:=1;

repeat {Преобразование FAT16 - FAT12}

buff[i]:=lo(FAT[j]);

buff[i+1]:= hi(FAT[j]) + (lo(FAT[j+1]) and 15) shl 4;

buff[i+2]:= hi(FAT[j+1] shl 4);

i:=i+3;

j:=j+2;

until(i>=(4608-3));

asm

mov ax,0

mov dx,1

mov cx,9

mov bx,offset buff;

int 26h

pop dx

end;

end.

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

указанного размера с без фрагментациеи . }

program videlenie;

uses crt; {Будем использовать функции модуля CRT}

var i,j:word; {ПОН}

buff : array [1..4608] of byte; {Буффер для работы с диском}

kor_sec,nach_dan,clustsiz:word; {Для сохранения двнных 0-ого кластера}

Fat : array [1..3072] of word; {Таблица FAT (16)}

nach_klast :word; {Номер кластера начала файла}

dir,Exitp : boolean; {Признак каталога,наличия места на диске}

noklasteraoglav : word; {Номер кластера оглавления}

v : longint; {Размер файла [байт]}

c : integer; {Результат преобразования строки в число}

razm : word; {Размер файла в кластерах}

nachklast : word; {Номер кластера с которого можно начать размещение}

s: string; {Имя файла}

procedure elem_ogl(i:word); {Читает i-ый элемент оглавления }

var claster,j : word; { кластера noklasteraoglav и возвращает}

begin { начальный кластер данных и }

claster :=noklasteraoglav+i div 16;{ рпизнак каталога }

i:=i mod 16;

asm

mov ax,0 { Каждый элемент оглавления имеет}

mov dx,claster { длину 32 байта ($20)}

mov cx,1

mov bx,offset buff;

int 25h

pop dx

end;

clrscr;

nach_klast :=buff[$20*i+27]+buff[$20*i+28]*256;

if (buff [$20*i+12] and $10 <> 0) then dir := true

else dir := false;

end;

function path(s:string):string; {Процедура дополняет имя файла пробелами }

var s1,s2 : string;

tochka : boolean; {Признак расширения}

k,i:byte;

begin

s1:=' '; {Заготовка имени файла}

s2:=''; {Расширение файла}

tochka:=false;

i:=1;

while i <= byte(s[0]) do {Пока не конец имени файла}

begin

begin

if (s[i] = '.') then { Если нашли точку, то}

begin

tochka := true; {устанавливаем признак расширения}

end

else

begin

if not(tochka) then {Если обрабатывается имя, то}

begin

if (s[i] >= 'a') and(s[i] <= 'z') then {Преобразовываем}

s1[i] := char(byte(s[i]) and 223) {маленькие буквы в большие}

else { и записываем в S1}

s1[i] := char(byte(s[i]));

end

else

begin {Если обрабатываем расширение, то}

while (s[i] <> '\') and (i <= byte(s[0])) do {Считываем}

begin {расширение в S2}

s2:=s2+s[i];

inc(i);

end;

if s2 <> '' then {Если расширение есть, то}

begin

for k:=1 to length(s2) do

begin {Преобразование в большие буквы и запись в S1 c конца}

if (s2[length(s2)-k+1] >= 'a') and(s2[length(s2)-k+1] <= 'z') then

s1[12-k] := chr(byte(s2[length(s2)-k+1]) and 223)

else

s1[12-k] := s2[length(s2)-k+1];

end;

end;

end;

end;

end;

i:=i+1; { Переход к след.символу имени}

end;

path := s1; {Возвращаем имя файла}

end;

begin

clrscr;

asm { Читаем нулевой кластер }

mov ax,0 { Диск A }

mov dx,0 { 0-ой кластер }

mov cx,1 { 1 кластер }

mov bx,offset buff;

int 25h

pop dx

end;

kor_sec:=((buff[18]+buff[19]*256)*32)div(buff[12]+buff[13]*256);{Корневых секторов}

nach_dan:=buff[15]+buff[16]*256+kor_sec+(buff[23]+buff[24]*256)*buff[17];{Начало данных}

clustsiz:=buff[14]; {Секторов на единицу размещения}

noklasteraoglav := (buff[23]+buff[24]*256)*buff[17]+buff[15]+buff[16]*256;{Номер кластера оголавления}

asm

mov ax,0 {Читаем FAT}

mov dx,1

mov cx,9

mov bx,offset buff;

int 25h

pop dx

end;

j:=1;

i:=1;

repeat {Преобразование FAT12 - FAT16}

fat[j]:=((buff[i]+buff[i+1]*256)) and 4095; {Записываем 1-12 биты}

fat[j+1]:=((buff[i+1] + buff[i+2]*256 )shr 4) and 4095 ;{13-24 биты}

i:=i+3; {Переход к следующей тойке FAT12}

j:=j+2; {Переход к следующей паре FAT16}

until(i>=(4608-3));

if paramcount = 2 then{Если есть 2 параметра,то начинаем обработку}

begin

razm := 0; {Обнуляем размер}

val (paramstr(2),v,c); { Пребразование 2-ого параметра в число}

if c = 0 then {Если преобразование прошло успешно, то}

begin

razm:=v div 512 ; {Определяем размер файла}

if v mod 512 <> 0 then inc(razm); { в кластерах }

i :=0;

j :=0;

Exitp:=false;

repeat {Просмотр FAT}

inc(i); {Переход к след. элементу FAT}

if fat[i] = 0 then {Если свободен, то}

begin

j:=j+1; {наращиваем счетчик свободных кластеров}

if j = razm then {Если нашли необходимое число }

Exitp := true; {кластеров, то прекращаем поиск }

if nachklast = 0 then {Запоминаем}

nachklast:= i; {первый свободный кластер}

end;

until(i>=3072) or (Exitp);{Пока не пройдем по всем элементам массива}

if Exitp then {Если нашли место, то}

begin

i:=0;

elem_ogl(i); {Считываем первый элемент оглавления}

{Ищем сободный элемент оглавления}

while (buff[$20*i+1] <> 0) and (buff[$20*i+1] <> byte('х'))and(noklasteraoglav < nach_dan) do

begin

if noklasteraoglav < nach_dan then {Если в корневом оглавлении}

begin { то }

i:=i+1; {Переходим к следующему элементу}

if (i = 16) then {Если следующий элемент в другом }

begin {кластере то}

inc(noklasteraoglav); {увеличиваем кластер оглавления}

i:=0;

end;

elem_ogl(i); {Считываем следующий элемет оглавления}

end;

end;

if noklasteraoglav < nach_dan then {Если нашли свободный элемент}

begin {то}

j:=0;

s:= paramstr(1); {преобразуем имя файла}

s:= path (s);

repeat

j:=j+1;

buff[$20*i+j] := byte(s[j]); {Записываем имя файла}

until(j = 11);

buff[$20*i+12] := 0; {Атрибут}

buff[$20*i+23] := 0; {Время}

buff[$20*i+24] := 0; { создания}

buff[$20*i+25] := 0; {Дата}

buff[$20*i+26] := 0; { создания}

buff[$20*i+27] := lo(nachklast);{Начальный кластер}

buff[$20*i+28] := hi(nachklast);{ данных }

buff[$20*i+29]:= lo( v mod 65536);{Размер }

buff[$20*i+30]:= hi( v mod 65536);{ файла }

buff[$20*i+31]:= lo(v div 65536); { в }

buff[$20*i+32]:= hi(v div 65536); { байтах}

asm

mov ax,0

mov dx,noklasteraoglav {Сохраняем изменения}

mov cx,1 { в кластере }

mov bx,offset buff;

int 26h

pop dx

end;

j:=1;

repeat {Корректируем FAT}

if (j = razm) then {Если конец цепочки}

begin

FAT[nachklast-1]:=4095; {Записываем признак}

j:=j+1; { конца }

end

else

begin

i := nachklast; {Сохраняем текущий кластер}

while FAT[nachklast+1]<> 0 do { ищем свободный кластер }

inc(nachklast);

FAT[i]:= nachklast; {Записываем ссылку на след кластер}

j:=j+1; {Увеличиваем число записанных кластеров}

inc(nachklast);

end;

until(j> razm);

writeln('Файл создан! ');

end

else

writeln('Нет места для создания файла в корневом каталоге');

end

else

writeln('Нет места!');

end

else

writeln('Неверный второй параметр!');

end

else

writeln('Нет параметров');

i:=1;

j:=1;

repeat {Преобразование FAT16 - FAT12}

buff[i]:=lo(FAT[j]);

buff[i+1]:= hi(FAT[j]) + (lo(FAT[j+1]) and 15) shl 4;

buff[i+2]:= hi(FAT[j+1] shl 4);

i:=i+3;

j:=j+2;

until(i>=(4608-3));

asm

mov ax,0

mov dx,1

mov cx,9

mov bx,offset buff;

int 26h

pop dx

end;

end.

Вывод

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

Соседние файлы в папке other