Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
#1

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

12.06.2012, 23:26. Просмотров 3715. Ответов 8
Метки нет (Все метки)

в консоли выводится бесконечный повторяющийся список, как этого избежать?!
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 <stdio.h>
#include <windows.h>
#include <conio.h>
#include <string>
 
using namespace std;
 
void findfiles(string dir){
HANDLE hFind;
WIN32_FIND_DATA FileData;
 
hFind=FindFirstFile((dir+"\\*").c_str(),&FileData);
 
if(hFind!=INVALID_HANDLE_VALUE){
do{
if(FileData.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY) {printf("%s\n",FileData.cFileName);findfiles(dir+"\\"+FileData.cFileName);}
else printf("%s\n",FileData.cFileName);
}while(FindNextFile(hFind,&FileData));
FindClose(hFind);
}
}
 
 
 
 
 
int main()
{
findfiles("E:");
_getch();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 23:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивный поиск файлов и папок (C++):

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

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

Поиск файлов и папок в текущем каталоге - C++
Добрый вечер!Нужна программа,которая при ее вызове,переходит в нужную папку(по имени) и выводит список файлов и папок.То есть изначально...

Рекурсивный поиск в списке - C++
Добрый вечер. Я решал одну задачку из книги Х.Дейтела и П.Дейтела &quot;Как программировать на C++&quot; и у меня возникла одна проблема. ...

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

поиск в ширину(Рекурсивный) - C++
Программа запускается но выдает ошибку(Задача такая: Создать программу для решения задачи построения слова из некоторого множества букв...

8
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 09:44 #2
Причина в том, что первые два результата, которые Вам возвращает Find... - это каталоги "." и "..". Их необходимо пропускать при разборе результатов. Просто проанализируйте FileData.cFileName - если там одна или две точки, то переходите на следующую итерацию
1
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
13.06.2012, 23:28  [ТС] #3
столкнулся с очередной проблемой в vusial c++.
нужно чтобы в label3 постоянно передавалось папка в какой идет поиск файлов через FindFirstFile. ниже описанная процедура у меня зависает,зависает и все приложение, вырубить можно тока через диспетчер задач. как можно "оживить" приложение, чтобы и приложение не зависало и передавалось в label3?!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private: System::Void FindFiles(string dir){
HANDLE hFind;
WIN32_FIND_DATA FileData;
 
hFind=FindFirstFile((dir+"\\*").c_str(),&FileData);
 
if(hFind!=INVALID_HANDLE_VALUE){
do{
if(FileData.dwFileAttributes | FILE_ATTRIBUTE_DIRECTORY){
    if(strcmp(FileData.cFileName,".")==0) continue;
    else if(strcmp(FileData.cFileName,"..")==0) continue;
    else {
        String ^s=gcnew String(dir.c_str());
        this->label3->Text=s;
        FindFiles(dir+"\\"+FileData.cFileName);
    }
}
0
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 23:33 #4
А что в условии while цикла?
0
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
13.06.2012, 23:42  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private: System::Void FindFiles(string dir){
HANDLE hFind;
WIN32_FIND_DATA FileData;
 
hFind=FindFirstFile((dir+"\\*").c_str(),&FileData);
 
if(hFind!=INVALID_HANDLE_VALUE){
do{
if(FileData.dwFileAttributes | FILE_ATTRIBUTE_DIRECTORY){
    if(strcmp(FileData.cFileName,".")==0) continue;
    else if(strcmp(FileData.cFileName,"..")==0) continue;
    else {
        String ^s=gcnew String(dir.c_str());
        this->label3->Text=s;
        FindFiles(dir+"\\"+FileData.cFileName);
    }
}
 
}while(FindNextFile(hFind,&FileData));
FindClose(hFind);
}
         }
исправил
0
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 23:49 #6
Похоже, continue игнорирует проверку условия в while и вызов FindNext. Перепишите тело цикла как
C++
1
2
3
4
5
6
    if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0)
    {
        String ^s=gcnew String(dir.c_str());
        this->label3->Text=s;
        FindFiles(dir+"\\"+FileData.cFileName);    
    }
0
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
14.06.2012, 00:15  [ТС] #7
не, проверка норм, хотя у вас более удобный код.
вставил ваш код, а проблема та же осталась:
1. нажимаю на кнопку - запускается эта рекурсивная проц-а
2. в label должно по идее записываться путь к папке, где происходит поиск файлов - такого нет
3. вся форма виснет - помогает тока диспетчер задач
0
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
14.06.2012, 00:29 #8
В label никакой надписи и не будет. Вы ее туда, конечно, занесли, но неплохо бы ее и отрисовать. А когда это делать, если алгоритм поиска файлов сихронный и съедает весь процессор? Вы увидите только последнее, что туда занесли, и только после того, как весь процесс отработает.
Обычно такие вещи делают в отдельном потоке, и по таймеру опрашивают этот поток, чтобы в основном потоке занести текущий обрабатываемый путь в метку.
1
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
14.06.2012, 14:44  [ТС] #9
мне кажется стопорюсь на самом простом - теперь не могу создать поток:
C++
1
2
3
4
5
6
7
8
9
10
11
private: System::Void FindFiles(...){
 
}
 
private: System::Void label5_Click(System::Object^  sender, System::EventArgs^  e) {
    this->label5->Visible=false;
    this->label4->Visible=true;
    HANDLE hFile;
    DWORD dwId;
    hFile=CreateThread(NULL,0,FindFiles("C:\\"),0,0,&dwId);
         }
error C2664: 'CreateThread' : cannot convert parameter 3 from 'void' to 'LPTHREAD_START_ROUTINE'
0
14.06.2012, 14:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2012, 14:44
Привет! Вот еще темы с ответами:

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

Рекурсивный и нерекурсивный поиск в глубину - C++
Не уверен в правильности работы даной функции. Если начинать с вершины 2, то рекурсивный и нерекурсивный поиски дадут одинаковые...

Помогите зациклить рекурсивный поиск - C++
Помогите зациклить поиск(пока работает для 2 список, если их больше не работает), вот часть кода if(NamebType.compare(&quot;Struct&quot;)==0) { ...

Рекурсивный, линейный поиск с использованием вектора - C++
Изучаю C++ по книжке Дейтелов &quot;Как прогарммировать на C++&quot;. Попалась задача на рекурсию: &quot;(Поиск наименьшего значения в массиве) Напишите...


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

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

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