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

Поиск файлов по расширению - C++

Восстановить пароль Регистрация
 
tagboy
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 16
09.07.2015, 10:10     Поиск файлов по расширению #1
Надо написать консольное приложение, где входными данными были бы путь к каталогу и расширения файлов, которых мы ищем. Внутри каталога могут быть вложенные папки, чтоб программа и во вложенных папках искала файлы. Чтоб найдя данные файлы, программа выводила их полные пути в виде списка.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2015, 10:10     Поиск файлов по расширению
Посмотрите здесь:

поиск файлов C++ Builder
Поиск файлов C++
Поиск файлов в директории C++
C++ Поиск файлов С++
Открыть файл по расширению C++/C C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Геомеханик
 Аватар для Геомеханик
517 / 324 / 253
Регистрация: 26.06.2015
Сообщений: 738
09.07.2015, 16:26     Поиск файлов по расширению #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <list>
#include <string>
#include <set>
#include <io.h>
typedef std::list<std::string> flist;
typedef std::set<std::string>  fset;
 
void  tokenize(const char* s, fset* exts);
char* copy_ext(char* d, int n, const char* s);
bool  is_ctrl_dir(const char* s);
 
 
//поиск файлов с указанными расширениями включая под-папки
bool get_files(const char* folder, const fset* exts, flist* lst){
    char        ext[32];
    std::string ps;
    _finddata_t inf;
 
    bool slash = true;
    ps = folder;
    if((ps.length() > 0) && (ps[ps.length() - 1] != '\\')){
        slash = false;
        ps   += '\\';
    }
    ps.append("*.*");
 
    long fp = _findfirst(ps.c_str(), &inf);
    if(fp == -1)
        return false;
 
    do {
 
        if(inf.attrib & _A_SUBDIR){ //искать в под-папках
 
            if(is_ctrl_dir(inf.name)){
                ps = folder;
                if(! slash)
                    ps += '\\';
                ps.append(inf.name);
                get_files(ps.c_str(), exts, lst);
            }
        } else {
 
            copy_ext(ext, sizeof(ext)-1, inf.name);
 
            if(exts->find(ext) != exts->end()){
                lst->push_back(folder);
                if(! slash)
                    lst->back() += '\\';
                lst->back().append(inf.name);
            }
        }
 
    } while(_findnext(fp, &inf) != -1);
 
    _findclose(fp);
    return true;
}
 
 
 
int main(void){
    //пример заданий расширений через точку запятой
    char ebuf[64] = "txt;pdf;doc;png;";
 
    //ввод расширений
    std::cout << "Enter exts: ";
    std::cin.getline(ebuf, sizeof(ebuf)-1);
 
    fset exts;
    tokenize(ebuf, &exts);
 
    //ввод пути 
    char path[255];
    std::cout << "Enter path: ";
    std::cin.getline(path, sizeof(path)-1);
    std::cin.sync();
 
    flist fs;
    get_files(path, &exts, &fs);
 
    //всего найденого файлов
    std::cout << "\tcount find files: "
              << fs.size() << std::endl;
 
    //вывести список найденных файлов
    flist::const_iterator i = fs.begin();
    while(i != fs.end()){
        std::cout << *i << std::endl;
        ++i;
    }
 
    fs.clear();
    exts.clear();
    std::cin.get();
    return 0;
}
 
//отделение расширений, пример: "txt;pdf;doc;png;"
void tokenize(const char* s, fset* exts){
    const char* p;
    while(*s){
        p = s;
        while(*p && (*p != ';'))
            ++p;
 
        if((p - s) > 0)
            exts->insert(std::string(s, p));
 
        if(*p == ';')
            ++p;
        s = p;
    }
}
 
//копируем расширение у имени файла
char* copy_ext(char* d, int n, const char* s){
    char* t = d;
    while(*s)
        ++s;
 
    s -= 1;
    while((s != t) && (*s != '.'))
        --s;
 
    if(*s == '.'){
        ++s;
        while(*s)
            *d++ = *s++;
    }
    *d = '\0';
    return t;
}
 
bool is_ctrl_dir(const char* s){
    int i = 0, j = 0;
    while(*s){
        if(*s == '.')
            ++i;
        ++s;
        ++j;
    }
    return (i != j);
}
tagboy
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 16
09.07.2015, 22:11  [ТС]     Поиск файлов по расширению #3
Огромное спасибо за код!!! Один вопрос(начиная с 87 строки), к сожалению я еще не знаком с элементами типа(класса) flist и хотелось бы узнать, как из переменной fs типа flist скопировать значение адресов файлов в любую переменную типа char. Например, char buf[255]; srtcpy(buf, fs.значение каждого адреса файла) в цикле
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
10.07.2015, 10:37     Поиск файлов по расширению #4
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
#include <iostream>
#include <string>
#include <boost/filesystem.hpp>
#include <boost/regex.hpp>
 
using std::string;
using std::cout;
using std::getline;
using std::cin;
namespace fs = boost::filesystem;
 
bool is_correct_extension (string extension)
{
    boost::regex regx ("^\\.[a-zA-Z]+$");
    return boost::regex_match (extension, regx);
}
 
int main()
{
    string path;
    cout << "Enter path: ";
    getline (cin, path);
    fs::path my_path (path);
    if (fs::exists (my_path) && fs::is_directory (my_path))
    {
        string extension;
        cout << "Enter extension in format \".extension\": ";
        getline (cin, extension);
        if (is_correct_extension (extension))
        {
            for (fs::recursive_directory_iterator i (path), end; i!=end; i++)
            {
                if (!fs::is_directory (i->path()) && i->path().extension() == extension)
                {
                    cout << i->path() << "\n";
                }
            }
        }
        else
            cout << "Extension is not correctly\n";
    }
    else
        cout << "Wrong path\n";
}
nyancat1
0 / 0 / 0
Регистрация: 30.08.2016
Сообщений: 1
30.08.2016, 22:53     Поиск файлов по расширению #5
@MicM

Здравствуйте, дорогие, новичок в этом, но очень впечатлен вашим кодом. Как сделать эту функцию, которая будет возвращать полный путь найденного файла? Кроме того, мне нужно добавить больше чем один фильтр для расширения, .mp3, .txt, и т.д., и он должен пропустить папку окна, которые мы можем определить, окна, и т.д. system32

ты говоришь по английски ? моя мать из России, но я вырос в Нью-Йорке
С уважением
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
30.08.2016, 23:00     Поиск файлов по расширению #6
nyancat1,
http://en.cppreference.com/w/cpp/experimental/fs
http://en.cppreference.com/w/cpp/regex
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2016, 16:16     Поиск файлов по расширению
Еще ссылки по теме:

C++ Как организовать поиск файлов по расширению?
C++ Поиск файлов
C++ Запуск приложения по расширению

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

Или воспользуйтесь поиском по форуму:
bornvita
 Аватар для bornvita
16 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 21
31.08.2016, 16:16     Поиск файлов по расширению #7
I need too -

@MicM

Здравствуйте, дорогие, новичок в этом, но очень впечатлен вашим кодом. Как сделать эту функцию, которая будет возвращать полный путь найденного файла? Кроме того, мне нужно добавить больше чем один фильтр для расширения, .mp3, .txt, и т.д., и он должен пропустить папку окна, которые мы можем определить, окна, и т.д. system32

ты говоришь по английски ? моя мать из России, но я вырос в Нью-Йорке
С уважением

Добавлено через 11 часов 15 минут
@MicM Пожалуйста, напишите измененный код я также нужен очень срочно и будет кредитовать ваш форум ссылку на профиль в коде кредитов. С уважением

Добавлено через 55 секунд
@MicM Пожалуйста, напишите измененный код я также нужен очень срочно и будет кредитовать ваш форум ссылку на профиль в коде кредитов. С уважением.
Yandex
Объявления
31.08.2016, 16:16     Поиск файлов по расширению
Ответ Создать тему
Опции темы

Текущее время: 17:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru