LINUX.ORG.RU

Программа, аналог команды ls

 , ,


0

3

Здравствуйте, уважаемые! Задание в ВУЗе такое у меня - написать аналог команды ls, c ключами, которые отображают: -a - все файлы, в т.ч. с точкой (скрытые) -i - имя файла и индексный дескриптор -s - имя файла и размер файла -m - имя файла и права доступа в символьном виде Первый аргумент командной строки - соответственно ключ опции, второй - путь к каталогу, и если каталог не задан - то текущий каталог Осуществил чтение каталога через функции opendir(), readdir(), closedir() - имена файлов, содержащиеся в каталоге были записаны в структуру. Для того, чтобы отсортировать эти файлы, согласно условию задачи, я хотел воспользоваться системными вызовами stat(), lstat(), fstat(), и результат, разумеется, вывести на экран. Но возникли вопросы: -как мне работать со структурой файлов, полученные от opendir(), readdir(), closedir(), в системных вызовах stat()? -как мне действовать для текущего каталога? Просто написать system(«ls -a») и программа выполнит команду для текущего каталога? Буду рад любой помощи!


Вроде как уже спрашивали аккурат 1:1 такую же хероту, вроде как послали того первого вопрощающего, посмотрим как будет в этом случае.

kep
()

для текущего каталога

getcwd()

arturpub ★★
()

Opensource называется так потому, что у него открыты исходники.

thesis ★★★★★
()

А что, у препода спросить уже не модно?

Но возникли вопросы: -как мне работать со структурой файлов, полученные от opendir(), readdir(), closedir(), в системных вызовах stat()?

Никак. Из структуры которую тебе заполнил readdir ты должен взять только имя файла.

как мне действовать для текущего каталога?

Текущий каталог - "."

slovazap ★★★★★
()

system() выполняет внешние программы. Сомневаюсь, что преподаватель этому обрадуется.

Вот простейшая реализация ls без опций и прочих защит от дураков:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

main(int argc, char **argv)
{
    DIR            *dptr;
    struct dirent  *ds;
    dptr = opendir(argv[1]);
    while ((ds = readdir(dptr)) != 0)
        printf("%s\n", ds->d_name);
    closedir(dptr);
}
Она просто воспринимает первый аргумент как путь к директории, содержимое которой и выводит.

saahriktu ★★★★★
()

Объяви структуру со всеми нужными полями (имя файла, права и тд). При чтении каталога заполняй массив с этими структурами, увеличивая его размер при необходимости. Для сортировки используй qsort.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Ответ

Благодарю Вас за совет. Он - лучший. Но остались, такие моменты, которые я понимаю, но осуществить не могу. Как можно с Вами связаться? P.S. с Linux познакомился 1.5 месяца назад, не обессудьте. Препод - зверь.

Nostro
() автор топика
Ответ на: комментарий от Legioner

Почта

Никогда раньше не встречал таких почтовых индексов, но письмо отправил. Если не письмо не пришло к Вам, напишите мне: glebfirst@yandex.ru

Nostro
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.