Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Obrazets.doc
Скачиваний:
21
Добавлен:
10.06.2015
Размер:
3.99 Mб
Скачать

Листинг 11. Процедура del

3.12. Команда dir

Для вывода информации о файлах и каталогах текущего каталога используются функции, процедуры и типы данных модуля dos - findfirst(s), findNext(s), где s – запись (структура), описывающая параметры файла – имя, размер, время создания.

Особенностью данного варианта выполнения команды DIR является подсчет суммы всех подпапок и папок, вывод этих данных в итогах:

Алгоритм работы команды:

1. Проверяем есть ли ключ помощи, если есть выводим справку.

2. Извлекаем путь или название папки которую мы хотим просмортеть.

3. Извлекаем ключи.

4. В зависимости от наличия ключей выполняем действия.

5. Если есть ключи ограничения добавления, то добавляем в таблицу только то что проходит фильтр.

6. Если есть ключи сортировки то выполняем сортировку таблицы согласно условию.

7. Выводим данные из таблицы на экран.

Примерный вид процедуры на языке Object Pascal, реализующей команду dir, приведен ниже.

if UpperCase (rg.Match[0]) = 'DIR ' then

begin

rg.Expression := '\/\?';

rg.Exec(tl);

if rg.Match[0] = '/?' then

begin

MyWriteln('DIR [DISK:] [PATH] [FILE NAME] [/A[[:[R][H][D][S][A]]]][/O[:[N][D][S][E][G]]]]'

+#13#10+'/NF показывать объем папок'

+#13#10+'/A:R показывать только для чтения'

+#13#10+'/A:H показывать только скрытые'

+#13#10+'/A:D показывать только каталоги'

+#13#10+'/A:S показывать только системные'

+#13#10+'/A:A показывать только архивные'

+#13#10+'/O:N сортировать по имени'

+#13#10+'/O:D сортировать по дате'

+#13#10+'/O:S сортировать по размеру'

+#13#10+'/O:E сортировать по расширению'

+#13#10+'/O:G сортировать по типу(каталоги вверх выводятся)'

+#13#10+'Просмотр содержимого каталога');

goto g1;

end

else

begin

rg.Expression := '[ ][A-Za-z][:][\\A-Za-z0-9]*';

rg.Exec(tl);

if rg.Match[0] = ''

then

begin

rg.Expression := '[ ]+[\\A-Za-z0-9]+';

rg.Exec(trimleft(tl));

if rg.Match[0] = ''

then

begin

help := StringReplace(curpath,'>','',[rfReplaceAll]);

if help[Length(help)] <> '\'

then help := help + '\';

if not DirectoryExists(help)

then

begin

MyWriteln('Данная директория не существует');

goto g1;

end;

end

else

begin

help := rg.Match[0];

help:= StringReplace(curpath,'\>','',[rfReplaceAll])+help;

help := StringReplace(help,' ','',[rfReplaceAll]);

if help[Length(help)] <> '\'

then help := help + '\';

if not DirectoryExists(help)

then

begin

MyWriteln('Данная директория не существует');

goto g1;

end;

end;

end

else

begin

help := trim(rg.Match[0]);

if help[Length(help)] <> '\'

then help := help + '\';

if not DirectoryExists(help)

then

begin

MyWriteln('Данная директория не существует');

goto g1;

end;

end;

ffd.vrtltbl1.Open;

ffd.vrtltbl1.Clear;

rg.Expression := '\/A:[-RHDSA]+';

rg.Exec(UpperCase(tl));

if rg.Match[0] <> ''

then

begin

if Length(rg.Match[0])>4

then

begin

flag := 0;

for i := 4 to Length(rg.Match[0]) do

begin

case rg.Match[0][i] of

'R':begin

if not (rg.Match[0][i-1] = '-')

then flag := flag + faReadOnly

else flag := flag -(faReadOnly);

end;

'H':begin

if not (rg.Match[0][i-1] = '-')

then flag := flag + faHidden

else flag := flag -(faHidden);

end;

'D':begin

if not (rg.Match[0][i-1] = '-')

then flag := flag + faDirectory

else flag := flag -(faDirectory);

end;

'S':begin

if not (rg.Match[0][i-1] = '-')

then flag := flag + faSysFile

else flag := flag -(faSysFile);

end;

'A':begin

if not (rg.Match[0][i-1] = '-')

then flag := flag + faArchive

else flag := flag -(faArchive);

end;

end;

end;

end

else

begin

case rg.Match[0][Length(rg.Match[0])] of

'R':begin

flag := SysUtils.faReadOnly;

end;

'H':begin

flag := SysUtils.faHidden;

end;

'D':begin

flag := SysUtils.faDirectory;

end;

'S':begin

flag := SysUtils.faSysFile;

end;

'A':begin

flag := SysUtils.faArchive;

end;

end;

end;

end

else flag := 0;

attr := 0;

attr := faAnyFile;

if FindFirst(help+'*.*', attr, SR) = 0 Then

Repeat

sum := 0;

rg2.Exec(Trim(rg.Match[0])+SR.Name);

if ((sr.Attr and SysUtils.faDirectory) = SysUtils.faDirectory) and ((SR.Name <> '.')or (SR.Name <> '..'))

then SSizeDir := GetSize(Trim(help)+SR.Name)

else SSizeDir := int64(SR.FindData.nFileSizeLow) or (int64(SR.FindData.nFileSizeHigh) shl 32);

if flag <> 0

then

begin

if (SR.Attr and flag) = flag

then

begin

if not ((SR.Name = '.')or (SR.Name = '..'))

then

begin

ffd.vrtltbl1.Append;

if (sr.Attr and SysUtils.faDirectory) = SysUtils.faDirectory

then ffd.vrtltbl1.FieldByName('KAT').Value := '<D>'

else ffd.vrtltbl1.FieldByName('KAT').Value := '<F>';

ffd.vrtltbl1.FieldByName('NAME').Value := SR.Name;

ffd.vrtltbl1.FieldByName('DATE').Value := CreationTime(SR.FindData.ftCreationTime);

ffd.vrtltbl1.FieldByName('SIZE').Value := SSizeDir/1000;

ffd.vrtltbl1.FieldByName('EXTEN').Value := ExtractFileExt(SR.Name);

ffd.vrtltbl1.FieldByName('TYPE').Value := SR.Attr;

ffd.vrtltbl1.Post;

end;

end;

end

else

begin

if not ((SR.Name = '.')or (SR.Name = '..'))

then

begin

ffd.vrtltbl1.Append;

if (sr.Attr and SysUtils.faDirectory) = SysUtils.faDirectory

then ffd.vrtltbl1.FieldByName('KAT').Value := '<D>'

else ffd.vrtltbl1.FieldByName('KAT').Value := '<F>';

ffd.vrtltbl1.FieldByName('NAME').Value := SR.Name;

ffd.vrtltbl1.FieldByName('DATE').Value := CreationTime(SR.FindData.ftCreationTime);

ffd.vrtltbl1.FieldByName('SIZE').Value := SSizeDir/1000;

ffd.vrtltbl1.FieldByName('EXTEN').Value := ExtractFileExt(SR.Name);

ffd.vrtltbl1.FieldByName('TYPE').Value := SR.Attr;

ffd.vrtltbl1.Post;

end;

end;

Until FindNext(SR) <> 0;

rg.Expression := '\/O:[NDSEG]{1}';

rg.Exec(UpperCase(tl));

if rg.Match[0] <> ''

then

begin

case rg.Match[0][Length(rg.Match[0])] of

'N':begin

ffd.vrtltbl1.IndexFieldNames := 'NAME';

end;

'D':begin

ffd.vrtltbl1.IndexFieldNames := 'DATE';

end;

'S':begin

ffd.vrtltbl1.IndexFieldNames := 'SIZE';

end;

'E':begin

ffd.vrtltbl1.IndexFieldNames := 'EXTEN';

end;

'G':begin

ffd.vrtltbl1.IndexFieldNames := 'EXTEN';

end;

end;

end;

pathcol := '0';

filcol := '0';

filcount := 0;

pathcount := 0;

ffd.vrtltbl1.First;

for i := 0 to ffd.vrtltbl1.RecordCount - 1 do

begin

if (ffd.vrtltbl1.FieldbyName('TYPE').AsInteger and SysUtils.faDirectory) = SysUtils.faDirectory

then

begin

pathcol := inttostr(strtoint64(pathcol)+ffd.vrtltbl1.FieldbyName('SIZE').AsInteger);

Inc(pathcount);

end

else

begin

filcol := inttostr(strtoint64(filcol)+ffd.vrtltbl1.FieldbyName('SIZE').AsInteger);

Inc(filcount);

end;

Writeln(formatdatetime('DD-MM-YYYY HH:MM',ffd.vrtltbl1.FieldbyName('DATE').AsDateTime):20,inttostr(ffd.vrtltbl1.FieldByName('SIZE').asInteger):15,ffd.vrtltbl1.FieldByName('KAT').asString:5,DecodeToOEM(ffd.vrtltbl1.FieldByName('NAME').asString):30);

ffd.vrtltbl1.Next;

end;

MyWriteln('----------------------------------------------------------------------');

Writeln(DecodeToOEM('Количесто папок'):19,inttostr(pathcount):6,DecodeToOEM('Общий размер папок'):22,pathcol:15,DecodeToOEM('Б'):2);

Writeln(DecodeToOEM('Количество файлов'):19,inttostr(filcount):6,DecodeToOEM('Общий размер файлов'):22,filcol:15,DecodeToOEM('Б'):2);

Writeln;

MyWriteln(GetDiskSize(copy(help,1,2)));

end;

goto g1;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]