С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
jon_illien
3 / 3 / 1
Регистрация: 14.08.2012
Сообщений: 78
#1

Рекурсивная функция вывода всех файлов и директорий - C++

03.02.2013, 22:45. Просмотров 803. Ответов 4
Метки нет (Все метки)

функция ищет все файлы включая директории с набором др. файлов и директорий при этом выводит их на экран.
Вместо того, чтобы вывести файлы директории, бесконечно выводит точку. посмотрите пожалуйста) :

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
int SearchAll(char *path)                        //приходит имя диска (f:\) и в последствии добавляется маска "*"
{
    char* temp_path = new char[strlen(path) + 1];       //добавляет к пути маску "*"
    strcpy(temp_path, path);                            //для поиска всех файлов
    strcat(temp_path, "*");                             //
 
    _finddata_t* fileinfo = new _finddata_t;            //указатель на объект структуры с информацией на файл
    long done;                                          //уникальный номер группы файлов в памяти
    long there_is_a_file;                               //для проверки: существует следующий файл?
    int count = 0;                                      //счетчик файлов
 
    done = _findfirst(temp_path, fileinfo);             //поиск файлов по указанному пути и маске, запись в структуру
    there_is_a_file = done;                             //fileinfo информации о первом найденном файле 
    
    while(there_is_a_file != -1)                        //если в списке есть файл
    {
        if(fileinfo->attrib == _A_SUBDIR)               //если это директория
        {
            cout << fileinfo->name << endl;
 
            char* transition_path = new char[strlen(path) + 4 + strlen(fileinfo->name)];   4 - две пары слешей 
            
            strcpy(transition_path, path);
            strcat(transition_path, "\\");
            strcat(transition_path, fileinfo->name);
            strcat(transition_path, "\\");
 
            count += SearchAll(transition_path);
            count++;
 
            delete []transition_path;
        }
        else                                                                          //соответственно не директория
        {
            cout << fileinfo->name << endl;
            count++;
        }
    }
 
    delete fileinfo;
    _findclose(done);
    
    return count;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2013, 22:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивная функция вывода всех файлов и директорий (C++):

Рекурсивная функция для вывода цифр натурального числа в обратном порядке - C++
написать рекурсивную функцию для вывода на экран цифр натурального числа в обратном порядке. помогите пожалуйстаа:)

Рекурсивная функция для расчета суммы всех двузначных чисел - C++
Напишите рекурсивную функцию расчета суммы всех двузначных чисел.

Функция вывода на экран всех множителей целого числа - C++
Написать программу. Функция вывода на экран всех множителей числа. Цикл for

Функция вывода на экран всех общих элементов двух одномерных массивов - C++
Доброй ночи. Пожалуйста помогите:cry: Начали новую тему, но не могу понять, какой нужно написать алгоритм. Задача: Функция...

Работа с деревом файлов/директорий - C++
Подскажите, пожалуйста, как преобразовать список из файлов и папок (гарантируется, что они описывают дерево с одним корнем - корневой...

Создание/копирование/переименование/удаление файлов и директорий - C++
Есть такие задания: 1) Выполнение создания/копирование/переименования/удаления файлов; 2) Выполнение...

4
m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,262
Завершенные тесты: 2
03.02.2013, 23:15 #2
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
int SearchAll(char *path)                        //приходит имя диска (f:\) и в последствии добавляется маска "*"
{
    char* temp_path = new char[strlen(path) + 1];       //добавляет к пути маску "*"
    strcpy(temp_path, path);                            //для поиска всех файлов
    strcat(temp_path, "*");                             //
 
    _finddata_t* fileinfo = new _finddata_t;            //указатель на объект структуры с информацией на файл
    long done;                                          //уникальный номер группы файлов в памяти
    long there_is_a_file;                               //для проверки: существует следующий файл?
    int count = 0;                                      //счетчик файлов
 
    done = _findfirst(temp_path, fileinfo);             //поиск файлов по указанному пути и маске, запись в структуру
    there_is_a_file = done;                             //fileinfo информации о первом найденном файле 
    
    while(there_is_a_file != -1)                        //если в списке есть файл
    {
        if(fileinfo->attrib == _A_SUBDIR && strcmp(fileinfo->name, ".") != 0 && strcmp(fileinfo->name, "..") != 0)               //если это директория
        {
            cout << fileinfo->name << endl;
 
            char* transition_path = new char[strlen(path) + 4 + strlen(fileinfo->name)];//   4 - две пары слешей 
            
            strcpy(transition_path, path);
            strcat(transition_path, "\\");
            strcat(transition_path, fileinfo->name);
            strcat(transition_path, "\\");
 
            count += SearchAll(transition_path);
            count++;
 
            delete []transition_path;
        }
        else                                                                          //соответственно не директория
        {
            cout << fileinfo->name << endl;
            count++;
        }
        there_is_a_file = _findnext(done, fileinfo); 
    }
 
    delete fileinfo;
    _findclose(done);
    
    return count;
}
1
jon_illien
3 / 3 / 1
Регистрация: 14.08.2012
Сообщений: 78
03.02.2013, 23:31  [ТС] #3
спасибо!!! блин) про _findnext совем забыл)) "." и ".." - это текущая и внешняя директория?, но тогда почему они являются именем
C++
1
fileinfo->name
и для чего нужна проверка:
C++
1
&& strcmp(fileinfo->name, ".") != 0 && strcmp(fileinfo->name, ".."
, при выводе все равно отображаются "." ".."
0
m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,262
Завершенные тесты: 2
04.02.2013, 00:40 #4
Цитата Сообщение от jon_illien Посмотреть сообщение
, при выводе все равно отображаются "." ".."
поставь проверку, чтобы не выводило

Цитата Сообщение от jon_illien Посмотреть сообщение
это текущая и внешняя директория?, но тогда почему они являются именем
она самая
1
jon_illien
3 / 3 / 1
Регистрация: 14.08.2012
Сообщений: 78
04.02.2013, 02:42  [ТС] #5
благодарю за помощь)
0
04.02.2013, 02:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2013, 02:42
Привет! Вот еще темы с ответами:

Как написать программу, удаляющую несколько файлов из разных директорий каждые 5 секунд? - C++
Здравствуйте, уважаемы форумчани! Ситуация такая: нужно удалять несколько файлов из разных директории каждые 5 секунд. Подскажите...

Рекурсивная функция - C++
...помогите пожалуйста сделать задачки... http://cs4734.vkontakte.ru/u26212689/96588963/x_20024bb4.jpg ...

Рекурсивная функция - C++
Вычислить элементы ряда с помощью рекурсивной функции. Порядок вычисления элементов ряда: a(1)=1, a(n)=5*(2n-1)n-a(n-1), n&gt;0 ...

Рекурсивная функция - C++
Здраствуйте, пытаюсь написать лабу для нахождения пути в лабиринте, выбрал волновой алгоритм Ли. Для начала хочу просто заполнить...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.