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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
12.06.2012, 23:26     Рекурсивный поиск файлов и папок #1
в консоли выводится бесконечный повторяющийся список, как этого избежать?!
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();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 23:26     Рекурсивный поиск файлов и папок
Посмотрите здесь:

Вывод списка файлов и папок директории C++
поиск в ширину(Рекурсивный) C++
C++ Получить список файлов и папок
C++ Синхронизация папок и файлов
Рекурсивный поиск файла. Падаю C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 09:44     Рекурсивный поиск файлов и папок #2
Причина в том, что первые два результата, которые Вам возвращает Find... - это каталоги "." и "..". Их необходимо пропускать при разборе результатов. Просто проанализируйте FileData.cFileName - если там одна или две точки, то переходите на следующую итерацию
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);
    }
}
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 23:33     Рекурсивный поиск файлов и папок #4
А что в условии while цикла?
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);
}
         }
исправил
soft.creator
 Аватар для soft.creator
103 / 103 / 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);    
    }
Mustang92
3 / 3 / 1
Регистрация: 24.04.2011
Сообщений: 150
14.06.2012, 00:15  [ТС]     Рекурсивный поиск файлов и папок #7
не, проверка норм, хотя у вас более удобный код.
вставил ваш код, а проблема та же осталась:
1. нажимаю на кнопку - запускается эта рекурсивная проц-а
2. в label должно по идее записываться путь к папке, где происходит поиск файлов - такого нет
3. вся форма виснет - помогает тока диспетчер задач
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
14.06.2012, 00:29     Рекурсивный поиск файлов и папок #8
В label никакой надписи и не будет. Вы ее туда, конечно, занесли, но неплохо бы ее и отрисовать. А когда это делать, если алгоритм поиска файлов сихронный и съедает весь процессор? Вы увидите только последнее, что туда занесли, и только после того, как весь процесс отработает.
Обычно такие вещи делают в отдельном потоке, и по таймеру опрашивают этот поток, чтобы в основном потоке занести текущий обрабатываемый путь в метку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2012, 14:44     Рекурсивный поиск файлов и папок
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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'
Yandex
Объявления
14.06.2012, 14:44     Рекурсивный поиск файлов и папок
Ответ Создать тему
Опции темы

Текущее время: 04:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru