Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5

Проблема с opendir

08.08.2011, 12:03. Показов 7802. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем кто зашёл в темку.
Столкнулся с необходимостью рекурсивно пройти по всем директориям в директории.

В массив "с" пишу директорию. Как раз она открывается отлично. Но когда передаю в 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);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.08.2011, 12:03
Ответы с готовыми решениями:

opendir/readdir
здраствуйте!!! подскажите пожалуйста как использовать opendir/readdir на примере.

Проблемы с opendir
Всем привет! Начала учить Perl и вот первая проблемка. Вот код: opendir(DIR, 'D:\\abc') || die &quot;Error: $!\n&quot;; my @files =...

opendir() русские папки
opendir() выводит ошибку на русских папках Если добавить header('Content-Type: text/html; charset=utf-8');такую: Если убрать...

10
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
08.08.2011, 12:15
Подозреваю, что dir->d_name содержит само название папки, а если неизвестно абсолютного пути к папке, то она ищется в текущей.
0
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
08.08.2011, 12:33  [ТС]
хм...

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

Описание.

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

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

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

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

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

Как бы это учесть?
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
09.08.2011, 12:57
lala2.1 где находится?
0
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
09.08.2011, 13:18  [ТС]
Цитата Сообщение от kazak Посмотреть сообщение
lala2.1 где находится?
в lala2
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
09.08.2011, 13:21
В исходную директорию возврат делаешь?
0
0 / 0 / 0
Регистрация: 08.08.2011
Сообщений: 5
09.08.2011, 14:43  [ТС]
Цитата Сообщение от kazak Посмотреть сообщение
В исходную директорию возврат делаешь?
Да если даже не в исходную а в предидущую
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
09.08.2011, 23:44
Придумал такой велосипед, правда файлы без расширений полукорректно обрабатывает.
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;
}
0
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 3
18.03.2013, 17:46
Тема старая, но напишу, сам на нее наткнулся через гугл, когда искал информацию для решения своей лаб. работы (сделать программу в 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);
 
}
Здесь конечно нет проверок на различного рода ошибки, и это плохой тон программирования, но мне это было не нужно, учитывая специфику моего задания.

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2013, 17:46
Помогаю со студенческими работами здесь

Ошибка в строке открытия директории. opendir
&lt;?php echo 'Альбомы песни!&lt;br/&gt;'; $lines=file('visits.txt'); for($i=2;$i&lt;count($lines);$i++) { ...

что такое: 1).opendir?, 2).readdir? и 3). stat(fstat)?
всем добрый вечер... плз пжлст что такое: 1).opendir?, 2).readdir? и 3). stat(fstat)? всем заранее спасибо

Файловый менеджер (opendir,readdir,chdir,closedir)
Всем привет! Возникла задача: реализовать файловый менеджер(СИ). Ступор прям в самом начале. Как менеджер работает, я знаю, но...

Как пройти по файлам папки с использованием opendir и readdir
При использовании следующего кода браузер показывает только беЗконечные точки:, кто поможет исправить именно с этими функциями. С...

Как реализовать chdir через opendir, readdir, closedir?
Всем привет! Хочу реализовать функцию chdir через такие функции, как opendir, readdir, closedir. Совсем недавно начал разбираться....


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru