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

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

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

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

12.06.2012, 23:26. Просмотров 3498. Ответов 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();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
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
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
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++
Список файлов и папок на глубину 2 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     Рекурсивный поиск файлов и папок
Ответ Создать тему
Опции темы

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