Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 05.01.2016
Сообщений: 12
1

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

15.02.2017, 21:20. Показов 2332. Ответов 1
Метки нет (Все метки)

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

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <windows.h>
#include <iostream>
#include<tchar.h>
using namespace std;
 
int main()
{
    DWORD dwError = 0;
    int counter = 1;
    TCHAR buff[1024];
    TCHAR Name1[1024] = _T("C:\\test\");
    TCHAR Name2[1024] = _T("C:\\test\"); 
    setlocale(LC_ALL, "rus");
    WIN32_FIND_DATA find;
    HANDLE hFind = FindFirstFile(_T("C:\\test\\*"), &find);
    {
        if (INVALID_HANDLE_VALUE == hFind)
        {
            cout << "Каталог не найден!" << endl;
            system("pause");
            return dwError;
        }
        cout << "Текстовые файлы до изменения:" << endl;
        do {
            if (!(find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(find.dwFileAttributes & FILE_ATTRIBUTE_DEVICE))
            {
                _tprintf(_T("%s\n"), find.cFileName);
                _stprintf(buff, _T("%d"), counter);
                if (!MoveFile(Name1, Name2))
                {
                    _tcscpy(Name1, _T("C:\\test\"));
                    _tcscpy(Name2, _T("C:\\test\"));
                }
                 _tcscat(Name2, buff);
                _tcscat(Name2, find.cFileName);
                _tcscat(Name1, find.cFileName);
                if (!MoveFile(Name1, Name2));
                cout << "Ошибка!" << endl;
                counter++;
            }
        } while (FindNextFile(hFind, &find) != NULL);
        dwError = GetLastError();
        if (dwError != ERROR_NO_MORE_FILES)
        {
            if (!FindClose(hFind))
            cout << "Ошибка закрытия!";
            cout << "В каталоге нет файлов!" << endl;
            system("pause");
            return dwError;
        }
    }
    if (!FindClose(hFind))
    cout << "Ошибка закрытия!";
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2017, 21:20
Ответы с готовыми решениями:

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

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

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

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

1
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
17.02.2017, 09:22 2
Vindt_Vndt1998, запускай рекурсивно... если каталог, то вызывай снова с новым путем.

Добавлено через 14 часов 22 минуты
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <windows.h>
#include <locale.h>
#include <tchar.h> 
#include <stdio.h>
#include <strsafe.h>
 
DWORD show_err(LPCTSTR msg) {
    LPTSTR str_err;
    DWORD no = GetLastError();  
    if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
                    | FORMAT_MESSAGE_FROM_HMODULE
                    | FORMAT_MESSAGE_ALLOCATE_BUFFER
                    | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, no, MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT), &str_err, 0, NULL)) {
        _tprintf(_TEXT("%s: %d\n%s\n"), msg, no, str_err);
        LocalFree(str_err);
    } else
        _tprintf(_TEXT("%s:\nномер ошибки %d\n"), msg, no);  
 
    return no;
}
 
DWORD proc(LPCTSTR dir, DWORD * pn) {
    TCHAR path[MAX_PATH] = {0};
    if(S_OK != StringCchCopy(path, MAX_PATH, dir)) 
        return show_err(_TEXT("Не удалось сформировать путь к каталогу"));
        
    if(path[_tcslen(path)] != _T('\\') && S_OK != StringCchCat(path, MAX_PATH, _TEXT("\\*"))) 
        return show_err(_TEXT("Не удалось сформировать путь с маской"));
    else if(S_OK != StringCchCat(path, MAX_PATH, _TEXT("*")))
        return show_err(_TEXT("Не удалось сформировать путь с маской"));
 
    /*фрагмент пути без маски*/
    DWORD len = _tcslen(path)-sizeof(TCHAR);
    
    /*найдем первый файл*/
    WIN32_FIND_DATA ffd;
    HANDLE hFind = FindFirstFile(path, &ffd);
    if(hFind != INVALID_HANDLE_VALUE) {
        do {
            if(!_tcscmp(ffd.cFileName, _TEXT(".")))
                continue;
            if(!_tcscmp(ffd.cFileName, _TEXT(".."))) 
                continue;
            
            /*исходное имя файла*/
            _tprintf(_TEXT("%s -->"), ffd.cFileName);
            TCHAR path_to_file_from[MAX_PATH] = {0};
            if(S_OK != StringCchCopyN(path_to_file_from, MAX_PATH, path, len)) {
                show_err(_TEXT("Не удалось сформировать полный путь к исходному файлу"));
                continue;
            }
            if(S_OK != StringCchCat(path_to_file_from, MAX_PATH, ffd.cFileName)) {
                show_err(_TEXT("Не удалось сформировать полный путь к исходному файлу"));
                continue;
            }
            /*вложенная директория*/
            if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                proc(path_to_file_from, pn);
            } else {
                /*формируем новое имя*/
                TCHAR path_to_file_to[MAX_PATH] = {0};
                if(S_OK != StringCchCopyN(path_to_file_to, MAX_PATH, path, len)) {
                    show_err(_TEXT("Не удалось сформировать новое имя файла"));
                    continue;
                }
                TCHAR tmp[MAX_PATH];
                _sntprintf_s(tmp, MAX_PATH, _TRUNCATE, _TEXT("(%d) "), *pn);
                if(S_OK != StringCchCat(path_to_file_to, MAX_PATH, tmp)) {
                    show_err(_TEXT("Не удалось сформировать новое имя файла"));
                    continue;
                }
                if(S_OK != StringCchCat(path_to_file_to, MAX_PATH, ffd.cFileName)) {
                    show_err(_TEXT("Не удалось сформировать новое имя файла"));
                    continue;
                }
 
                /*переименовываем файл*/
                if(!MoveFile(path_to_file_from, path_to_file_to)) {
                    show_err(_TEXT("Не удалось переименовать файла"));
                    continue;
                }
 
                ++*pn;
            }
            
        } while(FindNextFile(hFind, &ffd));
        FindClose(hFind);
    }
 
    return S_OK;
}
 
int main() {
    /*локализация*/
    setlocale(LC_ALL, "rus");
 
    /*путь к каталогу и маска поиска файлов*/
    LPTSTR dir = _TEXT("e:\\myCert");   
    
    DWORD n = 0;
    proc(dir, &n);
    
    system("pause");
    return 0;
}
0
17.02.2017, 09:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2017, 09:22
Помогаю со студенческими работами здесь

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

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

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

для указанной директории произвести рекурсивный перебор всех вложенных поддиректорий и файлов с занесением результатов в файл
Необходимо разработать приложение (на языке программирования C++), которое позволяет для указанной...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru