Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
1

Рекурсивный поиск файлов однозначно должен приводить к краху программы

10.12.2016, 22:58. Показов 697. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При поиске файлов в папках и подпапках, всегда в примерах используется метод FindFirstFile, FindNextFile с дальнейшей рекурсией. Есть такой пример который используется чуть ли не везде -
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)
{
    LPTSTR part;
    char tmp[MAX_PATH]; // временный массив
    char name[MAX_PATH];
 
    HANDLE hSearch = NULL;
    WIN32_FIND_DATA wfd;
    memset(&wfd, 0, sizeof(WIN32_FIND_DATA));
 
    // сначала поиск внутри вложенных папках ...
    if(bInnerFolders)
    {
        if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;
        strcpy(name, part);
        strcpy(part, "*.*");
 
        // если папки существуют, то делаем поиск
        wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
        if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
        do
        {
            // в каждой папке есть две папки с именами "." и ".."
            // и эти папки мы не трогаем
 
            // пропускаем папки "." и ".."
            if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))            
            continue;
        
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку
            {
                char next[MAX_PATH];
                if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
                strcpy(part, wfd.cFileName);
                strcat(next, "\");
                strcat(next, name);
 
                SearchFiles(next, lpSearchFunc, TRUE);
            }
        }
        while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
 
        FindClose (hSearch); // заканчиваем поиск
    }
 
    if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) 
        return TRUE; // в противном случае выходим
    do
    if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл
    {
        char file[MAX_PATH];
        if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
        strcpy(part, wfd.cFileName);
 
        lpSearchFunc(file);
    }
    while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
    FindClose (hSearch); // заканчиваем поиск
 
    return TRUE;
}
В принципе прекрасный пример. Все понятно и работает, но есть одно но, при большой глубине рекурсии произойдет переполнение стека и вылет программы. Как этого избежать, может есть более надежные способы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2016, 22:58
Ответы с готовыми решениями:

Рекурсивный поиск файлов
Всем здравия. Недельку назад начал копать информацию про рекурсивный поиск, то ли я плохо ищу, то...

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

Рекурсивный поиск файлов
Приветствую. Есть вот такая рабочая функция: function Scan($dir) { if...

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

3
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.12.2016, 23:35 2
Цитата Сообщение от zombivadim Посмотреть сообщение
Как этого избежать, может есть более надежные способы?
Данный код можно переписать на обычных циклах, т.е. без рекурсии.
0
12 / 11 / 2
Регистрация: 03.04.2016
Сообщений: 502
11.12.2016, 12:13  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
Данный код можно переписать на обычных циклах, т.е. без рекурсии.
??А такое возможно??
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
11.12.2016, 12:35 4
А почему нет? Какие препятствия? Любой рекурсивный алгоритм можно переписать на циклах.
0
11.12.2016, 12:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2016, 12:35
Помогаю со студенческими работами здесь

рекурсивный поиск файлов
Всем привет! Нажно реализовать поиск файлов по маске. Набрасал вот такой код: int...

Рекурсивный Поиск файлов
Доброго всем времени суток, я к вам со следующей проблемой: необходимо разобраться с рекурсивным...

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

Рекурсивный поиск файлов и папок
в консоли выводится бесконечный повторяющийся список, как этого избежать?! #include <stdio.h>...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru