- •1. Цель курсовой работы
- •2. Командный процессор ос ms Windows cmd
- •2.1. Оболочка (интерпретатор) командной строки command.Com/cmd.Exe
- •Листинг 1. Процедура инициализации
- •2.3. Структура команд. Параметры и ключи. Вывод справочной информации
- •2.4. Команды
- •2.4.4. Команды Date и Time
- •2.4.7.2. Команда cd
- •2.4.7.3. Команда dir
- •2.4.7.4. Команды mkdir
- •2.4.7.5. Команда del или erase
- •3. Назначение ключей и параметров, описание команд
- •3.1. Команда type
- •Листинг 2. Процедура type
- •3.2. Команда time
- •Листинг 3. Процедура отображения и установки времени
- •3.3. Команда date
- •Листинг 4. Отображение и установка системного времени
- •3.4. Команда mkdir
- •Листинг 5. Процедура mkdir
- •3.5. Команда rd
- •Листинг 6. Процедура rd
- •3.6. Команда cd
- •3.7. Команда attrib
- •Листинг 7. ПроцедураAttrib
- •3.8. Команда cls
- •Листинг 8. Процедура cls
- •3.9. Команда sort
- •Листинг 9. Процедура sort
- •3.10. Команда echo
- •Листинг 10. Процедура echo
- •3.11. Команда del|erase
- •Листинг 11. Процедура del
- •3.12. Команда dir
- •Листинг 12. ПроцедураDir
- •3.13. Команда invertcolor
- •Листинг 13. Процедура invertcolor
- •3.14. Разбиение на лексемы, синтаксический анализ, регулярные выражения
- •Листинг 14. Проверка на соответстиве команд
- •3.15. Процедуры упорядочивания массива (сортировка)
- •3.17. Русификация вывода командного процессора
- •4. Примеры выполнения работы команд
- •4.1. Команда dir
- •4.2. Команда attrib
- •4.3. Команда date и time
- •4.4. Команда type и sort
- •4.5. Команда mkdir, rd, cd
- •4.7. Команда cls и echo
- •4.8. Команда del | erase
- •5. Литература
Листинг 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;