1) Исходное задание такое:
Написать аналог команды ls -l, выдающий имена файлов каталога и их коды доступа в формате rwxrw-r--.
Для получения кодов доступа используйте вызов stat
stat( имяФайла, &st);
кодыДоступа = st.st_mode & 0777;
Для изменения кодов доступа используется вызов
chmod(имя_файла, новые_коды);
Можно изменять коды доступа, соответствующие битовой маске
0777 | S_ISUID | S_ISGID | S_ISVTX
(смотри <sys/stat.h>). Тип файла (см. функцию typeOf) не может быть изменен. Изменить коды доступа к файлу может только его владелец.
2) Порылся в интернете и нашёл такой скрипт:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int listdir(char *dirname)
{
register struct dirent *dirbuf;
DIR *fddir;
ino_t dot_ino = 0, dotdot_ino = 0;
if((fddir = opendir (dirname)) == NULL)
{
fprintf(stderr, "Can't read %s\n", dirname);
return 1;
}
/* Без сортировки по алфавиту */
while ((dirbuf = readdir (fddir)) != NULL )
{
if (dirbuf->d_ino == 0) continue;
if (strcmp (dirbuf->d_name, "." ) == 0)
{
dot_ino = dirbuf->d_ino;
continue;
}
else if(strcmp (dirbuf->d_name, "..") == 0)
{
dotdot_ino = dirbuf->d_ino;
continue;
}
else printf("%s\n", dirbuf->d_name);
}
closedir (fddir);
if(dot_ino == 0) printf("Поврежденный каталог: нет имени \".\"\n");
if(dotdot_ino == 0) printf("Поврежденный каталог: нет имени \"..\"\n");
if(dot_ino && dot_ino == dotdot_ino) printf("Это корневой каталог диска\n");
return 0;
}
int main(int ac, char *av[])
{
int i;
if(ac > 1) for(i=1; i < ac; i++) listdir(av);
else listdir(".");
return 0;
}
Всё отлично работает - выводит список файлов.
______________________________________
!!!)Но встаёт следующая задача:
- что нужно сделать, чтобы упорядочить по алфавиту выводящийся список файлов?
- что нужно добавить, чтобы рядом с файлом из списка выводился код доступа в формате rwxrw-r--?
______________________________________
3) Порылся ещё в интернете, наткнулся на скрипт stat, который выводит тип файла:
#include <sys/types.h>
#include <sys/stat.h>
typeOf( name ) char *name;
{
int type; struct stat st;
if( stat( name, &st ) < 0 )
{
printf( "%s не существует\n", name );
return 0;
}
printf("Файл имеет %d имен\n", st.st_nlink);
switch(type = (st.st_mode & S_IFMT))
{
case S_IFREG:
printf( "Обычный файл размером %ld байт\n",
st.st_size );
break;
case S_IFDIR:
printf( "Каталог\n" );
break;
case S_IFCHR: /* байтоориентированное */
case S_IFBLK: /* блочноориентированное */
printf( "Устройство\n" );
break;
case S_IFIFO:
printf( "FIFO-файл\n" );
break;
default:
printf( "Другой тип\n" );
break;
}
return type;
}
______________________________________
По отдельности всё работает. Как совместить, я не понимаю - скажем так, мне даже ничего не объясняли, а поставили задачу в лоб...
______________________________________
Кто поможет, буду признателен!
Спасибо!
______________________________________
Сайт, откуда взял скрипты:
http://www.opennet.ru/docs/RUS/bogatyrev/gl_6_1.html
На форуме ЗАПРЕЩЕНО:
2.6. Создавать темы с неинформативным названием, например «Помогите», «Пара вопросов», «Настройка Интернета» и т. п.
Измените название темы на более информативное, иначе тема будет закрыта.
1.4. Листинги и содержимое текстовых файлов следует добавлять в сообщение с помощью тега [спойлер], либо прикреплять к сообщению в виде отдельного файла.
А также, ознакомьтесь с Правилами форума и неукоснительно их соблюдайте.
san-alex