Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
jon_illien
3 / 3 / 1
Регистрация: 14.08.2012
Сообщений: 78
1

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

03.02.2013, 22:45. Просмотров 847. Ответов 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
Ответы с готовыми решениями:

Рекурсивная функция для вывода массива
Напишите рекурсивную функцию для вывода массива в следующем порядке. ...

Рекурсивная функция вывода ряда в обратном порядке
Написать рекурсивную функцию вывода рядка в обратном порядке

Рекурсивная функция для вывода цифр натурального числа в обратном порядке
написать рекурсивную функцию для вывода на экран цифр натурального числа в...

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

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

4
m1Rr0r
247 / 230 / 45
Регистрация: 05.02.2010
Сообщений: 3,283
Завершенные тесты: 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 / 45
Регистрация: 05.02.2010
Сообщений: 3,283
Завершенные тесты: 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

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

Работа с деревом файлов/директорий
Подскажите, пожалуйста, как преобразовать список из файлов и папок...

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


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

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

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