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

3.5. Вопрос 3: Могу ли я написать Is?

Логика получения содержимого каталога будет такой:

main()

opendir

while (readdir)

print d_name

closedir

Полный код программы Isl.c будет таким:

/"Isl.c

** цель - вывод списка содержимого каталога или каталогов

** при отсутствии аргументов используется., в противном случае

** используется список имен файлов через список аргументов

include <stdio.h>

#include <sys/types.h>

#include <dirent.h>

void do_ls(char fj);

main(int ac, char *av[ ])

{

if(ac==i)

do_ls.");

else

while (--ac){

printf("%s:\n", *++av);

do_ls(*av);

}

}

void do_ls(char dirname[ ])

/* list files in directory called dirname

*/

{

DIR "dir_ptr; /* каталог */

struct dirent 'direntp; /* каждая запись */

if ((dir_ptr = opendir(dirname)) == NULL)

fprintf(stderr,"ls1: cannot open %s\n", dirname);

else

while ((direntp = readdir(dir_ptr)) != NULL)

printf("%s\n", direntp->d_name);

closedir(dir_ptr);

}

}

Откомпилируем и запустим этот код, а затем сравним полученный результат с выводом коман­ды Is, которая работает на вашей системе:

$ cc -о Is1 Isl.c

$ Is1

.

..

s.tar

tail1

Makefile

Isl.c

Is2.c

chap03

old.src

docs

Is1

statl .c

statdemo.c

tail1.c

$ ls

Makefile docs Isl.c old_src statl.с taiH

chap03 Is1 Is2.c s.tar statdemo.c tail 1.с

$

3.5.1. Что еще нужно делать?

Неплохо для первой попытки. Эта версия 1.0 Is выводит список файлов в каталоге, но в дан-I ной версии не поддерживаются следующие возможности:

(a) Нет сортировки вывода.

Наш список имен файлов не отсортирован в алфавитном порядке. Устранение. Мы можем считать все имена файлов в массив, а затем использовать команду qsort для сортировки этого массива.

(b) Нет поколонного вывода.

Стандартная версия команды Is поддерживает возможность вывода списка имен файлов поколонно. В некоторых версиях расположение имен поколонно происходит сверху вниз, слева направо, а в других системах - слева направо, сверху вниз.

(с) Вывод файлов с именами с лидирующей точкой.

В этой версии отображаются имена файлов с точкой. В стандартной версии команды Is имена файлов с лидирующей точкой отображаются, только если используется опция -а. [ Устранение: Подавить вывод имен с лидирующей точкой достаточно просто и обеспечить их вывод по опции -а.

(d) He работает опция -1.

В стандартной версии Is производится вывод статусной информации о файле, если пользователь задает при обращении к команде опцию -I. В нашем варианте такой возможностей нет. Устранение: Добавить отработку опции -1 непросто. В структуре dirent. которая определена в заголовочном файле <dirent.h>, есть только несколько необходимых элементов структуре dirent отсутствует информация о размере файла, о собственнике, а также данные о других характеристиках файла. Если этой информации нет в каталоге, то где же она хранится?