0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 14

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

11.05.2018, 16:07. Показов 1219. Ответов 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,892
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,892
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,892
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru