Форум программистов, компьютерный форум CyberForum.ru

Проблема с opendir - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Hairesis
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
08.08.2011, 12:03     Проблема с opendir #1
Привет всем кто зашёл в темку.
Столкнулся с необходимостью рекурсивно пройти по всем директориям в директории.

В массив "с" пишу директорию. Как раз она открывается отлично. Но когда передаю в opendir имя следующей директории с помощью dir->d_name, получаю результат NULL.

Код собственно вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <cstdio>
#include <iostream>
#include <dirent.h> 
#include <string>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/param.h> 
#include <sys/stat.h> 
 
using namespace std;
 
void checkDirectory(char c[]);
 
int main()
{
  cout<<"Hello"<<endl;
  char c[]=".";
  checkDirectory(c);
}
 
void checkDirectory(char c[])
{
  DIR *d;
  struct dirent *dir;
  if((d = opendir(c))==NULL)
  {
   cout<<"Error in open dir: "<<c<<endl;
   return;
  }
 
  while((dir = readdir(d))!=NULL)
  {
    if( strcmp( dir->d_name, "." ) == 0 || 
        strcmp( dir->d_name, ".." ) == 0 ) 
    {
      continue;
    }
    
    if(strstr(".",dir->d_name)==NULL)
    {
      cout<<"Find new directory: "<<dir->d_name<<endl;
      chdir(dir->d_name);
      checkDirectory(dir->d_name);
    }
  }
  closedir(d);
}
Подскажите в чём может быть трабла.

Заранее спасибо!

Добавлено через 30 минут
Попробовал сделать через стринги. Тажа самая хрень.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <cstdio>
#include <iostream>
#include <dirent.h> 
#include <string>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/param.h> 
#include <sys/stat.h> 
 
using namespace std;
 
void checkDirectory(string c);
 
int main()
{
  cout<<"Hello"<<endl;
  string dirStr=string("demos");
  checkDirectory(dirStr);
}
 
void checkDirectory(string c)
{
  DIR *d;
  struct dirent *dir;
  if((d = opendir(c.c_str()))==NULL)
  {
   cout<<"Error in open dir: "<<c<<endl;
   return;
  }
 
  while((dir = readdir(d))!=NULL)
  {
    if( strcmp( dir->d_name, "." ) == 0 || 
        strcmp( dir->d_name, ".." ) == 0 ) 
    {
      continue;
    }
    
    if(strstr(".",dir->d_name)==NULL)
    {
      cout<<"Find new directory: "<<dir->d_name<<endl;
      chdir(dir->d_name);
      checkDirectory(string(dir->d_name));
    }
  }
  closedir(d);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
08.08.2011, 12:15     Проблема с opendir #2
Подозреваю, что dir->d_name содержит само название папки, а если неизвестно абсолютного пути к папке, то она ищется в текущей.
Hairesis
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
08.08.2011, 12:33  [ТС]     Проблема с opendir #3
хм...

int chdir(pathname);
char *pathname; path-имя нового рабочего дирек-
тория

Описание.

Функция chdir изменяет текущий рабочий директорий на дирек-
торий, определяемый по pathname; pathname должен ссылаться на су-
ществующий директорий.

Возвращаемое значение.

Функция chdir возвращает значение 0, если рабочий директо-
рий успешно изменен. Возвращаемое значение -1 указывает на ошиб-
ку;

Решил проверить что возвращает моя функция... Возвращает -1... Странно с чего бы это?

Добавлено через 4 минуты
Да правда проблема с путями. Нужно прослеживать путь. В моём втором варианте нужно в chdir добавлять предидущую директорию к пути.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
08.08.2011, 12:34     Проблема с opendir #4
Цитата Сообщение от Hairesis Посмотреть сообщение
Решил проверить что возвращает моя функция... Возвращает -1... Странно с чего бы это?
Цитата Сообщение от Hairesis Посмотреть сообщение
C++
1
2
chdir(dir->d_name);
checkDirectory(dir->d_name);
правильней будет
C++
1
2
chdir(с);
checkDirectory(dir->d_name);
Hairesis
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
08.08.2011, 16:18  [ТС]     Проблема с opendir #5
Цитата Сообщение от kazak Посмотреть сообщение
правильней будет
C++
1
2
chdir(с);
checkDirectory(dir->d_name);
Всё-равно обход будет идти до последней директории в ветке. т.е. :
lala1->lala2->lala3
.........lala2.1 -выдаст ошибку при открытии.

Как бы это учесть?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
09.08.2011, 12:57     Проблема с opendir #6
lala2.1 где находится?
Hairesis
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
09.08.2011, 13:18  [ТС]     Проблема с opendir #7
Цитата Сообщение от kazak Посмотреть сообщение
lala2.1 где находится?
в lala2
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
09.08.2011, 13:21     Проблема с opendir #8
В исходную директорию возврат делаешь?
Hairesis
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
09.08.2011, 14:43  [ТС]     Проблема с opendir #9
Цитата Сообщение от kazak Посмотреть сообщение
В исходную директорию возврат делаешь?
Да если даже не в исходную а в предидущую
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
09.08.2011, 23:44     Проблема с opendir #10
Придумал такой велосипед, правда файлы без расширений полукорректно обрабатывает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int checkDirectory(char *c)
{
   DIR *d;
   struct dirent *dir;
   int r;
 
   if((d = opendir(c))==NULL)
   {
      cout<<"Error in open dir: "<<c<<endl;
      return 1;
   }
   r = chdir(c);
 
   while((dir = readdir(d))!=NULL)
   {
      if( strcmp( dir->d_name, "." ) == 0 ||
          strcmp( dir->d_name, ".." ) == 0 )
      {
         continue;
      }
 
      if(strchr(dir->d_name, '.')==NULL)
      {
         cout<<"Find new directory: "<<dir->d_name<<endl;
        if (!checkDirectory(dir->d_name))
            chdir("..");
      }
   }
   closedir(d);
   return r;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2013, 17:46     Проблема с opendir
Еще ссылки по теме:

Проблема с do-while C++
Неразрешенный внешний символ при Opendir ("D://") C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nikopol
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 3
18.03.2013, 17:46     Проблема с opendir #11
Тема старая, но напишу, сам на нее наткнулся через гугл, когда искал информацию для решения своей лаб. работы (сделать программу в Linux на C - аналог find), так как данная информация мне помогла, решил дополнить тем что сам улучшил, может поможет кому, задания одинаковые у многих. Вообщем чтобы исправить небольшую недоработку в коде, относительно файлов без разрешения можно использовать иную проверку, вместо:
C++ (Qt)
1
2
3
4
5
6
if(strchr(dir->d_name, '.')==NULL)
      {
         cout<<"Find new directory: "<<dir->d_name<<endl;
        if (!checkDirectory(dir->d_name))
            chdir("..");
      }
можно проверить является ли текущий файл регулярным:
C
1
2
3
4
5
6
7
8
9
10
if (strcmp(d->d_name,".")==0 || strcmp(d->d_name,"..")==0) continue;
        stat(d->d_name, &s);
        if (S_ISREG(s.st_mode)) puts(d->d_name);
        else{
            printf("Найдет новый каталог: %s\n", d->d_name);
            if(!showdir(d->d_name)){
                printf("Возврат в предыдущую директорию...\n"); 
                chdir("..");
            }
        }
Полный код моей программы получился такой:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <sys/types.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
int showdir(char *c){
    DIR *f;
    struct dirent *d;
    int r;
    f = opendir(c); 
    struct stat s; //структура для работы с атрибутами файлов
    r = chdir(c);
    while (d = readdir(f)){
        if (strcmp(d->d_name,".")==0 || strcmp(d->d_name,"..")==0) continue;
        stat(d->d_name, &s); //получить доступ к атрибутам файла через ссылку -> к полю d_name структуры d
        if (S_ISREG(s.st_mode)) puts(d->d_name); // запрос S_ISREG - является ли регулярным файл посредством данных о нем в поле st_mode
        else{
            printf("Найдет новый каталог: %s\n", d->d_name);
            if(!showdir(d->d_name)){
                printf("Возврат в предыдущую директорию...\n"); 
                chdir("..");
            }
        }
    }
    closedir(f);
    return r;
}
main(){
    char c[]=(".");
    showdir(c);
 
}
Здесь конечно нет проверок на различного рода ошибки, и это плохой тон программирования, но мне это было не нужно, учитывая специфику моего задания.

Не по теме:

З.Ы. первое сообщение на форуме = )

Yandex
Объявления
18.03.2013, 17:46     Проблема с opendir
Ответ Создать тему
Опции темы

Текущее время: 10:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru