Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 18.02.2020
Сообщений: 86

Рекурсивный поиск файлов

24.03.2023, 18:13. Показов 1377. Ответов 2

Студворк — интернет-сервис помощи студентам
Написал такой код, для рекурсивного поиска файла без рекурсии с помощью opendir()/readdir(), начиная с определенного каталога, помогите изменить часть кода с поиском через readdir().
Code
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <sys/param.h>
 
#define MAX_INDENT_LEVEL 128
 
void walk_dir(char *dir);
 
int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Usage: %s <dir>\n\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    
    walk_dir(argv[1]);
 
    return EXIT_SUCCESS;
}
 
/////////////////////////////////////////////////////////////////////////////
 
void print_entry(int level, int type, const char *path) {
    if (!strcmp(path, ".") || !strcmp(path, ".."))
        return;
 
    char indent[MAX_INDENT_LEVEL] = {0};
    memset(indent, ' ', MIN((size_t)level, MAX_INDENT_LEVEL));
 
    printf("%s[%d] %s\n", indent, type, path);
}
 
typedef struct ent_t {
    char *dir_path;
    int dir_level;
} ent_t;
 
#define MAX_ALLOWED_DEPTH 100
 
void walk_dir(char *root_dir) {
    // Create dir "stack"
    ent_t *dir_stack = calloc(sizeof(ent_t), MAX_ALLOWED_DEPTH);
    ent_t *cur_dir = dir_stack;
    
    // Push starting dir onto stack
    cur_dir->dir_path = strdup(root_dir);
    cur_dir->dir_level = 0;
    cur_dir++;
    
    while(1) {
        // No more dirs to traverse
        if (cur_dir == dir_stack)
            break;
        
        // Pop dir from stack
        cur_dir--;
        char *dir = cur_dir->dir_path;
        int dir_level = cur_dir->dir_level;
        
        print_entry(dir_level, DT_DIR, dir);
        
        DIR *d = opendir(dir);
        if (d == NULL) {
            fprintf(stderr, "opendir() failed: %s: %s\n", dir, strerror(errno));
        }
        else {
            while(1) {
                errno = 0;
                struct dirent *p = readdir(d);
                if (p == NULL) {
                    if (errno != 0)
                        continue;   // Проблема, переходим к следующему элементу
                    else
                        break;      // В каталоге больше ничего нет
                }
                
                if (p->d_type == DT_DIR && strcmp(p->d_name, ".") 
                    && strcmp(p->d_name, "..")) {
                    if (cur_dir - dir_stack < MAX_ALLOWED_DEPTH) {
                        char buf[PATH_MAX] = {0};
                        sprintf(buf, "%s/%s", dir, p->d_name);
                        
                        // Push dir onto stack
                        cur_dir->dir_path = strdup(buf);
                        cur_dir->dir_level = dir_level + 1;
                        cur_dir++;
                    }
                    else {
                        fprintf(stderr, "Exceeding dir stack size!");
                    }
                }
                else {
                    print_entry(dir_level + 1, p->d_type, p->d_name);
                }
            }
            
            closedir(d);
        }
        
        if (dir) {
            free(dir);
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.03.2023, 18:13
Ответы с готовыми решениями:

рекурсивный поиск файлов
Всем привет! Нажно реализовать поиск файлов по маске. Набрасал вот такой код: int search_file(string disk, string mask) { char...

Рекурсивный поиск файлов
Была задача разработать простую функцию, которая по заданной маске ищет все возможные файлы в любой папке ну понятно. ФУнкция работает не...

Рекурсивный поиск файлов
Доброго времени суток. Нужна помощь есть код который вполне подходит мне он ищет диски на компе потом в каждом диске ищет файлы по маске,...

2
24.03.2023, 18:17

Не по теме:

Цитата Сообщение от vorr1s Посмотреть сообщение
рекурсивного поиска файла без рекурсии
это как мозговой штурм без мозга

0
0 / 0 / 0
Регистрация: 18.02.2020
Сообщений: 86
24.03.2023, 20:16  [ТС]
Ну вот как-то так просят, понимаю что звучит странно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2023, 20:16
Помогаю со студенческими работами здесь

Рекурсивный поиск файлов
Здравствуйте, решил для себя попробовать сделать рекурсивный вывод всех файлов с диска. for (const auto&amp; file :...

Рекурсивный поиск файлов
Привет всем! Пишу программу, имеющую функционал поиска файлов по ключевым словам. Для начала написал программу, которая перебирала бы...

Рекурсивный поиск файлов в подкаталогах
В общем имеется программа,которая перед каждым именем файла вставляет его порядковый номер и работает только с одним каталогом. Как сделать...

Рекурсивный поиск файлов в каталоге
Книга C++ builder Книга рецептов Ермолаев. С темой &quot;Получение списка файлов в каталоге&quot; разобрался. С темой &quot;Рекурсивный...

Рекурсивный поиск файлов через filesystem
Привет всем! Сегодня сделал функцию для рекурсивного поиска файлов, используя функционал filesystem из C++17, но при запуске возникает...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru