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

spo_2 / other / LR_SPO_1

.PAS
Скачиваний:
19
Добавлен:
27.05.2013
Размер:
5.85 Кб
Скачать
{ Ќ ©вЁ Ї®¤Є в «®ЈЁ, Ё¬ҐойЁҐ «Ёи­ЁҐ Є« бвҐал (®бв ў«Ґ­­лҐ Ї®б«Ґ г¤ «Ґ­Ёп
д ©«®ў) Ё гЄ § вм Ї®вҐаЁ ¤ЁбЄ®ў®Ј® Їа®бва ­бвў . }
Uses Crt,Dos;
Const {for FDD 3,5":1,44M}
SectSiz=512; {sectorBytes}
ClustSiz=1; {sectorsPerCluster}
ResSecs=1; {reserved sector}
FatCnt=2; {fatCopies }
RootSiz=224; {rootDirEntries}
FatSize=9; {sectorsPerFat}
Type
TFat = array[0..8*512] of byte;

TDirEntry = record
FileName : array [0..7] of Char;
Ext : array [0..2] of Char;
Atr : byte;
Reserved : array [1..10] of Char;
Time : word;
Date : word;
ClstrNo : word;
FileSize: longint;
end;
TCatalog = array [0..223] of TDirEntry;

Function ReadFat(Drive : byte; StartSec : Word; NumSec : Word; var Buf : TFat):boolean;
var RegDS,RegBX : Word;
label l1;
begin
RegDS := seg ( Buf );
RegBX := ofs ( Buf );
ReadFat := True;
asm
mov cx, NumSec
mov dx, StartSec
mov ax, RegDs
mov ds, ax
mov BX, RegBX
mov al, Drive
int $25
pop dx
jnc l1
end;
ReadFat := False;
l1:end;

Function ReadDir(Drive : byte; StartSec : Word; NumSec : Word; var Buf : TCatalog):boolean;
var RegDS,RegBX : Word;
label l1;
begin
RegDS := seg ( Buf );
RegBX := ofs ( Buf );
ReadDir := True;
asm
mov cx, NumSec
mov dx, StartSec
mov ax, RegDs
mov ds, ax
mov BX, RegBX
mov al, Drive
int $25
pop dx
jnc l1
end;
ReadDir := False;
l1:end;

Var HrdDrive:byte;
str1:string;
StrFileName:string;
Fat:TFat;
Catalog:array [0..1] of TCatalog;
m_iDirArr:array [0..20] of word;
clean:boolean;
iClstr,ClstrN,NumOfDeleted,NextCluster,NumOfSubDirs,i,j,k,t:word;

Function Fat12(var ClstrNo : word):word;
var adr,alloc : word;
begin
adr := ClstrNo*3 div 2;
alloc := Fat[adr];
alloc := alloc + Fat[adr+1]*256;
if Odd(ClstrNo) then
alloc := alloc shr 4
else
alloc := alloc and $0fff;
Fat12 := alloc;
end;

Procedure GetDir(var ClstrNo : word; i : integer);
var RootDirSectors,
FatSectors,
DataStart,
Sector : word;
begin
RootDirSectors := (RootSiz * 32) div SectSiz;
FatSectors := FatCnt * FatSize;
DataStart := ResSecs + FatSectors + RootDirSectors;
Sector := DataStart + ((ClstrNo-2) * ClustSiz);
ReadDir( HrdDrive , Sector , 1, Catalog[i] );
end;

Begin
Clrscr;
NumOfDeleted :=0;
HrdDrive := 0; {¤ЁбЄ a:}
writeln('Љ в «®ЈЁ Ё¬ҐойЁҐ г¤ «Ґ­­лҐ д ©«л: ');
{—⥭ЁҐ FAT12}
if ReadFat( HrdDrive,1,FatSize, Fat) then
{—⥭ЁҐ Є®а­ҐЈ®Ј® Є в «®Ј }
if ReadDir( HrdDrive,FatCnt*FatSize+1,(RootSiz*32)div
SectSiz,Catalog[0]) then
begin
j:=0;
{Їа®е®¤Ё¬ ўбо Є®а­Ґўго ¤ЁаҐЄв®аЁо}
for i:=0 to RootSiz-1 do
begin
{®вЄалў Ґ¬ ¤ЁаҐЄв®аЁЁ, Ґб«Ё Ґбвм}
if (Catalog[0][i].Atr and $10) = $10 then
begin
{§ Ї®¬Ё­ Ґ¬ бв ав Є« бвҐа ў ¬ ббЁўҐ ¤ЁаҐЄв®аЁ©}
m_iDirArr[j] := Catalog[0][i].ClstrNo;
inc(j);
writeln('Љ в «®Ј: ',Catalog[0][i].FileName,' Cв ав Є« бвҐа ',Catalog[0][i].ClstrNo);
end;
end;
{ў Є®а­Ґў®¬ Є в «®ЈҐ ¬®¦Ґв Ё ­Ґ ᮤҐа¦ вмбп бгЎ¤ЁаҐЄв®аЁ©}
if (m_iDirArr[0] = 0) then
begin
Writeln('‚ Є®а­Ґў®¬ Є в «®ЈҐ ­Ґв Ї®¤Є в «®Ј®ў');
exit;
end;
{Ґб«Ё ў Є« бвҐаҐ ЇаЁбгвбвўгҐв ­Ґг¤ «Ґ­­л© д ©«, в® нв®в Є« бвҐа
бзЁв Ґвбп § ­пвл¬, Ё­ зҐ Є« бвҐа Їгбв®©(ᮤҐа¦Ёв в®«мЄ® г¤ «Ґ­­лҐ
д ©«л)}
k := j;
NumOfSubDirs :=j;
for i := 0 to NumOfSubDirs-1 do
begin
NextCluster := m_iDirArr[i];
clean := TRUE;
While NextCluster <> $0fff do
begin
clean := TRUE;
{зЁв Ґ¬ ¤ЁаҐЄв®аЁо ў ЎгдҐа}
GetDir(NextCluster,1);
t := 0; {16 dir entries per 1 cluster}
while t < 16 do
{Ґб«Ё Ґбвм ¤ЁаҐЄв®аЁЁ в® Ўг¤Ґ¬ ®вЄалў Ґ¬ Ёе}
begin
if (Catalog[1][t].Filename[0] <> #0) then
if (Catalog[1][t].Filename[0] <> '.') then
if (Catalog[1][t].Filename[0] <> 'е') then
begin
clean := False;
{­ҐбвҐавл¬ д ©«®¬ ¬®¦Ґв Ўлвм ¤ЁаҐЄв®аЁп}
if (Catalog[1][t].Atr and $10) = $10 then
begin
{§ Ї®¬Ё­ Ґ¬ бв ав Є« бвҐа ў ¬ ббЁўҐ ¤ЁаҐЄв®аЁ©}
m_iDirArr[k] := Catalog[1][t].ClstrNo;
inc(k);
end;
end;
inc(t);
end;{dir entries}
{§ Є®­зЁ«Ё Їа®жҐбб а бᬮваҐ­п Є« бвҐа  Є в «®Ј 
Їа®ўҐа塞 Ўл«Ё «Ё ­Ґг¤ «Ґ­­лҐ д ©«л ў ­Ґ¬}
if clean then begin
writeln('Џгбв®© Є« бвҐа ў Є в «®ЈҐ б® бв ав Є« бвҐа®¬ = ',m_iDirArr[i]);
inc (NumOfDeleted);
end;
{бзЁвлў Ґ¬ б«Ґ¤гойЁ© ў 楯®зЄҐ Ї®¤Є в «®Ј  Є« бвҐа}
NextCluster := Fat12(NextCluster);
end;{б«Ґ¤гойЁ© Є« бвҐа}
end;{­®¬Ґа Ї®¤Є в «®Ј }
if (NumOfDeleted <> 0 ) then begin
writeln ('Љ®«ЁзҐбвў® Їгбвле Є« бвҐа®ў ў Є в «®ЈҐ( е) = ',NumOfDeleted);
writeln ('Џ®вҐаЁ ¤ЁбЄ®ў®Ј® Їа®бва ­бвў : ',NumOfDeleted*512);
end
else writeln('„ЁбЄ ­Ґ ᮤҐа¦Ёв Їгбвлx Є« бвҐа®ў ®бв ў«Ґ­­ле ў Є в «®Ј е');
end;
repeat until keypressed;
End.


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