LINUX.ORG.RU

Фича ФС?


0

0

При написании одной программы мне потребовалась функция, выводящая список директорий в заданной дире. И вот обнаружилась прикольная фича - прога нормально обрабатывает данные только если в качестве директории ей передаётся текущая.

Программа, выводящая список директорий в заданной:

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

#include <dirent.h>

main(int argc, char *argv[])

{

struct dirent *fd;

DIR *dfd;

struct stat bfstat;

dfd=opendir(argv[1]);

while((fd=readdir(dfd))!=NULL)

{

stat(fd->d_name,&bfstat);

if((bfstat.st_mode & S_IFMT)==S_IFDIR)

printf("%s is a directory\n",fd->d_name);

}

closedir(dfd);

}

пример её запуска:

laz@darkstar:~/devel/tmpdir$ ls -la

итого 20

drwxr-xr-x 4 laz coolusers 4096 2005-09-27 23:15 ./

drwx------ 10 laz coolusers 4096 2005-09-27 23:14 ../

-rw-r--r-- 1 laz coolusers 0 2005-09-27 23:12 file1

-rw-r--r-- 1 laz coolusers 0 2005-09-27 23:13 file2

-rw-r--r-- 1 laz coolusers 401 2005-09-27 23:14 temp.c

drwxr-xr-x 2 laz coolusers 4096 2005-09-27 23:12 test1/

drwxr-xr-x 2 laz coolusers 4096 2005-09-27 23:12 test2/

laz@darkstar:~/devel/tmpdir$ gcc temp.c -o temp

laz@darkstar:~/devel/tmpdir$ ./temp .

. is a directory

.. is a directory

test1 is a directory

test2 is a directory

laz@darkstar:~/devel/tmpdir$ cd ..

laz@darkstar:~/devel$ tmpdir/temp tmpdir/

. is a directory

.. is a directory

test1 is a directory

test2 is a directory

file1 is a directory

file2 is a directory

laz@darkstar:~/devel$ cd tmpdir/test

test1/ test2/

laz@darkstar:~/devel$ cd tmpdir/test1/

/home/laz/devel/tmpdir/test1

laz@darkstar:~/devel/tmpdir/test1$ ../temp ..

. is a directory

.. is a directory

test1 is a directory

test2 is a directory

file1 is a directory

file2 is a directory

temp.c is a directory

temp is a directory

Как видите, в зависимости от диры, из которой она запущена, по разному определяются директории.

В чём прикол понять не могу, друзья программеры с Линуксом не знакомы, а в гугле даже запрос составить толком не могу. Объясните, плз, в чём тут загвоздка.

★★★★★
Ответ на: комментарий от myhand

Спасибо Вам, разобрался, хоть и с большим трудом =))

Дело в в чём: stat(fd->d_name,&bfstat); заполняет bfstat на основе _только_ имён фалов, то есть, надо передавать ещё и путь к нему. Усиливалась путаница ещё и тем, что у меня в разных директориях были файлы и директории с одинаковыми именами =)

В общем спасибо :)

З.Ы.

Наверное сказывается действие сегодняшней лабы по инфе, нас два часа паскалём мучали, после него думать отвыкаешь =)

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