Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/37: Рейтинг темы: голосов - 37, средняя оценка - 4.65
5 / 5 / 2
Регистрация: 24.04.2011
Сообщений: 153

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

12.06.2012, 23:26. Показов 7259. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в консоли выводится бесконечный повторяющийся список, как этого избежать?!
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.06.2012, 23:26
Ответы с готовыми решениями:

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

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

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

17
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 09:44
Причина в том, что первые два результата, которые Вам возвращает Find... - это каталоги "." и "..". Их необходимо пропускать при разборе результатов. Просто проанализируйте FileData.cFileName - если там одна или две точки, то переходите на следующую итерацию
2
5 / 5 / 2
Регистрация: 24.04.2011
Сообщений: 153
13.06.2012, 23:28  [ТС]
столкнулся с очередной проблемой в 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
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 23:33
А что в условии while цикла?
0
5 / 5 / 2
Регистрация: 24.04.2011
Сообщений: 153
13.06.2012, 23:42  [ТС]
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
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 23:49
Похоже, 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
5 / 5 / 2
Регистрация: 24.04.2011
Сообщений: 153
14.06.2012, 00:15  [ТС]
не, проверка норм, хотя у вас более удобный код.
вставил ваш код, а проблема та же осталась:
1. нажимаю на кнопку - запускается эта рекурсивная проц-а
2. в label должно по идее записываться путь к папке, где происходит поиск файлов - такого нет
3. вся форма виснет - помогает тока диспетчер задач
0
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
14.06.2012, 00:29
В label никакой надписи и не будет. Вы ее туда, конечно, занесли, но неплохо бы ее и отрисовать. А когда это делать, если алгоритм поиска файлов сихронный и съедает весь процессор? Вы увидите только последнее, что туда занесли, и только после того, как весь процесс отработает.
Обычно такие вещи делают в отдельном потоке, и по таймеру опрашивают этот поток, чтобы в основном потоке занести текущий обрабатываемый путь в метку.
1
5 / 5 / 2
Регистрация: 24.04.2011
Сообщений: 153
14.06.2012, 14:44  [ТС]
мне кажется стопорюсь на самом простом - теперь не могу создать поток:
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
1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 31
07.02.2021, 20:57
Подниму ещё одну устаревшую тему.

Пользуюсь вот этим рекурсивным обходом директорий.
Хочу задавать эти вещи оттуда
C++
1
2
#define PATH L"C:\\gcc"
#define DEST_PATH  L"D:\\1\\log.txt"
самостоятельно с помощью Edit'ов так, чтобы лог сохранялся в корне сканируемой папки:
C++
1
2
3
4
5
6
7
8
char PATH_[1024] = { 0 };
 GetWindowTextA(hEdit1, PATH, 1024);
if (sc(PATH[strlen(PATH) - 1]) != 92) { strcat(PATH, "\\"); }
#define LOG_FILE "C:\\Users\\User\\LexAnalyser\\BaseFolder\\log.txt"
char* LOG_FILE = strcat(PATH, "log.txt");
HANDLE logFile = CreateFileA(LOG_FILE, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   WriteData(logFile, PATH);
CloseHandle(logFile);
В hEdit1 указываю: C:\\Users\\User\\LexAnalyser\\BaseFolder.
Лог сохраняется там, где я указываю. Но почему при варианте define LOG_FILE WriteData сканирует мою папку BaseFolder, как и надо, а при варианте char* LOG_FILE сканирование идёт в папке моего проекта C++ (причём не до конца)?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.02.2021, 21:22
Цитата Сообщение от alsu-24 Посмотреть сообщение
Лог сохраняется там, где я указываю. Но почему при варианте define LOG_FILE WriteData сканирует мою папку BaseFolder, как и надо, а при варианте char* LOG_FILE сканирование идёт в папке моего проекта C++ (причём не до конца)?
Может потому что буфер у тебя объявлен с подчёркиванием
Цитата Сообщение от alsu-24 Посмотреть сообщение
char PATH_[1024] = { 0 };
Но нигде дальше ты PATH_ не используешь
0
1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 31
08.02.2021, 04:50
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Может потому что буфер у тебя объявлен с подчёркиванием

Но нигде дальше ты PATH_ не используешь
Наверное, вчера при редактировании поста (думал, что можно строки в коде принудительно цветом выделить) случайно поставил там подчёркивание. Вот так правильно (и проблема, указанная мной выше сохраняется):
C++
1
2
3
4
5
6
7
8
char PATH[1024] = { 0 };
 GetWindowTextA(hEdit1, PATH, 1024);
if (sc(PATH[strlen(PATH) - 1]) != 92) { strcat(PATH, "\\"); }
#define LOG_FILE "C:\\Users\\User\\LexAnalyser\\BaseFolder\\log.txt"
char* LOG_FILE = strcat(PATH, "log.txt");
HANDLE logFile = CreateFileA(LOG_FILE, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   WriteData(logFile, PATH);
CloseHandle(logFile);
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.02.2021, 09:51
Цитата Сообщение от alsu-24 Посмотреть сообщение
Вот так правильно (и проблема, указанная мной выше сохраняется):
Попробуй вот так
Цитата Сообщение от alsu-24 Посмотреть сообщение
//#define LOG_FILE "C:\\Users\\User\\LexAnalyser\\BaseFolde r\\log.txt"
char* LOG_FILE = strcat(PATH, "log.txt");
HANDLE logFile = CreateFileA(PATH, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   WriteData(logFile, PATH);

И посмотри, чему у тебя равен PATH
0
1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 31
08.02.2021, 14:17
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Попробуй вот так

И посмотри, чему у тебя равен PATH
C:\Users\User\LexAnalyser\BaseFolder\log .txt
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.02.2021, 14:22
Цитата Сообщение от alsu-24 Посмотреть сообщение
C:\Users\User\LexAnalyser\BaseFolder\log .txt
Это не то, что нужно?
0
1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 31
08.02.2021, 15:13
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это не то, что нужно?
Файл создаётся нормально. Но рекурсивный обход в случае define идёт в той директории, которую я задаю в текстовом поле, а в случае char* - в папке проекта. Каким образом это зависит от имени лога...
На самом деле я уже просто создал две переменных - для сканируемой директории и для директории лога. Работает!
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.02.2021, 15:28
Цитата Сообщение от alsu-24 Посмотреть сообщение
Файл создаётся нормально. Но рекурсивный обход в случае define идёт в той директории, которую я задаю в текстовом поле, а в случае char* - в папке проекта. Каким образом это зависит от имени лога...
Т.е. у тебя не работает поиск, а показываешь создание файла, которое всегда работало нормально? Молодец, чё.
0
1 / 1 / 0
Регистрация: 07.03.2018
Сообщений: 31
08.02.2021, 15:42
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Т.е. у тебя не работает поиск, а показываешь создание файла, которое всегда работало нормально? Молодец, чё.
Конечно, ведь в случае одного способа задания расположения лога поиск работает, а в случае другого - нет. И больше ничего на это не влияет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2021, 15:42
Помогаю со студенческими работами здесь

Рекурсивный поиск папок, подпапок и файлов
Здравствуйте, Есть программа которая ищет папки, подпапки и файлы, как можно сделать, чтобы все данные об папка, подпапках и файлах...

Рекурсивный просмотр папок и файлов
Почему этот код при нахождении поддиректории в данной папке не хочет заходить рекурсивно в поддиректорию? function scan($d=''){ ...

Рекурсивный поиск папок
Люди, хепл плиз. Бьюсь второй день. Есть скрипт: MsgBox ShowFolderList (&quot;c:\temp&quot;) function ShowFolderList(folderspec) Dim...

Рекурсивный вывод всех папок и файлов
Господа казалось бы банальный вопрос , но что то я упёрся !!! Вообщем делаю функцию которая показывает все папки и файлы в этих папках ,...

Рекурсивный поиск файлов
Была задача разработать простую функцию, которая по заданной маске ищет все возможные файлы в любой папке ну понятно. ФУнкция работает не...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru