Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 14

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

11.05.2018, 16:07. Показов 1306. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Была задача разработать простую функцию, которая по заданной маске ищет все возможные файлы в любой папке ну понятно. ФУнкция работает не правильно из-за того, что не правильно задается путь. SetCurrentDirectory(buffer) как-то криво работает иииии я не знаю , что делать с этим, если есть возможность, то устраните мои ошибки

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
bool Search_File(TCHAR *buffer, char mas[])
{
    HANDLE file;
    WIN32_FIND_DATA ffd = {0};
    TCHAR temp[MAX_PATH];
    TCHAR str[MAX_PATH];
   
    SetCurrentDirectory(buffer);//текуций католог 
    file = FindFirstFile(TEXT(mas),&ffd);
    
    
    if (file == INVALID_HANDLE_VALUE) {
        cout <<"Файл не был найден"<<endl;
        return false;
    }
    else{
        do{
            if(!strcmp(ffd.cFileName, TEXT("."))||!strcmp(ffd.cFileName, TEXT(".."))){
                continue;
            }   
            if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){//если не установлен бит, тогда файл
                strcpy(temp, buffer);
                
                strcat(temp, "\\");
                strcat(temp, ffd.cFileName);
                
                Search_File(buffer, mas);
                
                strcpy(buffer, temp);
                           
                continue;
            }
            cout<<"найденый файл:"<<ffd.cFileName<<endl;
                        
        }
        while(FindNextFile(file,&ffd) != 0);    
    }
    FindClose(file);
    
    return true;    
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2018, 16:07
Ответы с готовыми решениями:

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

Рекурсивный поиск файлов
Привет всем! Пишу программу, имеющую функционал поиска файлов по ключевым словам. Для начала написал программу, которая перебирала бы...

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

6
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
11.05.2018, 23:41
sasha7971182,
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
void Search_File(CHAR *curDir) {
    HANDLE file;
    WIN32_FIND_DATAA ffd = {0};
    CHAR temp[MAX_PATH];
    // формируем маску поиска
    lstrcpyA(temp, curDir);
    lstrcatA(temp, "\\");
    lstrcatA(temp, "*.*");
    // начинаем поиск
    file = FindFirstFileA(temp, &ffd);
    if (file == INVALID_HANDLE_VALUE) {
        std::cout << "Файл не был найден"<<std::endl;
        return;
    }
 
    do {
        if (!lstrcmpA(ffd.cFileName, ".")
        ||  !lstrcmpA(ffd.cFileName, "..")) {
            // пропускаем
            continue;
        }   
        // формируем полный путь к найденному элементу
        lstrcpyA(temp, curDir);
        lstrcatA(temp, "\\");
        lstrcatA(temp, ffd.cFileName);
        // выводим файл/директорию
        std::cout << temp <<std::endl;
        // заходим в директорию?
        if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            Search_File(temp);
            continue;
        }
    }
    while (FindNextFileA(file, &ffd) != 0);    
    FindClose(file);
}
Запускать, например, так (в окончании пути не должно быть слешей):
C++
1
Search_File("z:\\work")
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 14
12.05.2018, 13:18  [ТС]
а если допустим дисков 2 или больше, она ведь не будет перехдить на другие диски :c Как бы пофиксить это
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
12.05.2018, 22:36
sasha7971182, как-то так:
C++
1
2
3
4
5
6
7
8
9
for (CHAR drive[4] = "A:\\"; *drive <= 'Z'; *drive += 1) {
    UINT driveType = GetDriveType(drive);
    if (driveType != DRIVE_UNKNOWN &&
        driveType != DRIVE_NO_ROOT_DIR) {
        drive[3] = '\0';
        Search_File(drive);
        drive[3] = '\\';
    }
}
0
0 / 0 / 0
Регистрация: 13.05.2018
Сообщений: 3
14.05.2018, 08:54
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
#include"TCHAR.H"
#include "windows.h"
using namespace std;
BOOL AQLCreateDirectory(LPCTSTR sPathTo);
int main() {
    char dir[MAX_PATH];
    //"C:\\1\\2\\3\\4\\5\\6\\7\\8";//директория, которую нужно создать
    cout << "Enter path, Example: C:\\Documents and Test\\Administrator\\Application Data\\My Company\\My Software\\Settings" << endl;
    cin >> dir;
    AQLCreateDirectory(sPathTo);
    system("pause");
    return 0;
}
 
BOOL AQLCreateDirectory(LPCTSTR sPathTo)
{
    BOOL bRet = sPathTo ? TRUE : FALSE;
    int t;
    //пока директория не создана, будем пытаться её создать
    while (bRet && (bRet = CreateDirectory(sPathTo, NULL)) == FALSE)
    {
        // директория не создана, поэтому нужно сначала создать ”предыдущую” директорию
        __try {
            int k = lstrlen(sPathTo);
            if (k >= MAX_PATH) break; // Слишком длинное имя....
            LPTSTR   sTemp = LPTSTR(_alloca((k + 1) * sizeof(TCHAR))); // Экономия стека :)
            lstrcpy(sTemp, sPathTo);
            while (k && sTemp[k] != TCHAR('\\')) --k;
            if (k <= 0) break; // похоже, что директория создана быть вообще не может!
            sTemp[k] = TCHAR('\0');
            bRet = AQLCreateDirectory(sTemp);
        }
        __except (GetExceptionCode() == STATUS_STACK_OVERFLOW) { break; }
    }
    return bRet;
}
Подскажите, прожалуйста, как исправить? Функция рекурсивно создает каталоги, но при C:\\Documents and Test встречает в пути пробел и создается C:\\Documents вместо C:\\Documents and Test.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
14.05.2018, 11:01
julat21, попробуйте вот так запускать AQLCreateDirectory():
C++
1
2
3
4
    std::string dir;
    std::cout << "Enter path: ";
    std::getline(std::cin, dir);
    AQLCreateDirectory(dir.c_str());
1
0 / 0 / 0
Регистрация: 13.05.2018
Сообщений: 3
14.05.2018, 11:16
Не могу пока проверить. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2018, 11:16
Помогаю со студенческими работами здесь

Рекурсивный поиск файлов пропускает UNICODE имена
Помогите, прошу вас! void searchFiles(const char * dirn) { char dirnPath; sprintf(dirnPath, &quot;%s\\*&quot;, dirn); ...

Рекурсивный поиск файлов однозначно должен приводить к краху программы
При поиске файлов в папках и подпапках, всегда в примерах используется метод FindFirstFile, FindNextFile с дальнейшей рекурсией. Есть...

Рекурсивный поиск файлов заполняет не выгруженный пул памяти Си WINAPI
Приветствую,джентельмены. Пытаюсь выполнить поиск файлов на локальном диске,включая файлы во всех каталогах. Использовал для этого...

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

FindFirstFile и FindNextFile рекурсивный поиск файла
Как безопасно (без всевозможных переполнений и высвобождением ресурсов) реализовать рекурсивный поиск файла на одном из разделов диска? Или...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru