Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
tagboy
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 44
#1

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

09.07.2015, 10:10. Просмотров 985. Ответов 7
Метки нет (Все метки)

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

Поиск файлов по расширению по всем дискам - C++
Друзья помогите пожалуйста !!! На с# нашел программу которая ищет файлы по расширению по всему ПК Ни как не могу понять как перевести...

Как организовать поиск файлов по расширению? - C++
У меня есть директория, в которой файлы с расширением *.txt! И мне надо что бы программа сама их нашла все... Помогите! Я не знаю как такое...

Открыть файл по расширению C++/C - C++
Добрый день. Решил написать простенькую программу на Си/Си++, которая в конкретной папке на диске изменяет одну строчку во ВСЕХ файлах с...

Запуск приложения по расширению - C++
Добрый вечер Подскажите пожалуйста Необходимо написать программу, в которой при выборе расширения будет открываться соответствующее...

Поиск файлов - C++
Помогите хотя бы в теории понять, возможен ли поиск файлов без использования функций библиотеки windows.h вообще, и как его можно...

Поиск файлов - C++
Вот решил перейти к изучению C++ после Delphi, интерисует как найти все файлы в папке :) Готовый код или ссылки, буду рад всему :)

7
Геомеханик
707 / 513 / 362
Регистрация: 26.06.2015
Сообщений: 1,220
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);
}
2
tagboy
0 / 0 / 0
Регистрация: 04.01.2015
Сообщений: 44
09.07.2015, 22:11  [ТС] #3
Огромное спасибо за код!!! Один вопрос(начиная с 87 строки), к сожалению я еще не знаком с элементами типа(класса) flist и хотелось бы узнать, как из переменной fs типа flist скопировать значение адресов файлов в любую переменную типа char. Например, char buf[255]; srtcpy(buf, fs.значение каждого адреса файла) в цикле
0
MicM
822 / 480 / 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";
}
1
nyancat1
0 / 0 / 0
Регистрация: 30.08.2016
Сообщений: 1
30.08.2016, 22:53 #5
@MicM

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

ты говоришь по английски ? моя мать из России, но я вырос в Нью-Йорке
С уважением
0
hoggy
6719 / 2904 / 499
Регистрация: 15.11.2014
Сообщений: 6,538
Завершенные тесты: 1
30.08.2016, 23:00 #6
nyancat1,
http://en.cppreference.com/w/cpp/experimental/fs
http://en.cppreference.com/w/cpp/regex
1
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 Пожалуйста, напишите измененный код я также нужен очень срочно и будет кредитовать ваш форум ссылку на профиль в коде кредитов. С уважением.
0
Павел21061988
0 / 0 / 0
Регистрация: 24.03.2016
Сообщений: 1
05.03.2017, 23:19 #8
Уважаемые форумчане, доброго всем времени суток. Такой вопрос (возможно, такая тема уже где-то обсуждалась, просто я не нашел): Есть приложение для поиска файлов, состряпанное "по кусочкам", найденным на просторах Интернета(в том числе и здесь где-то находил), написанное на Dev C++ (Версия 4.9.9.2). И нужно из консольного окна этого приложения каким-то образом "достать" список файлов, найденных этим же приложением, в текстовый файл(формат не принципиален).Т.е. список должен в идеале перебрасываться в текстовик из консоли автоматом. Такое вообще реально? Ломаю голову 2й день...
0
05.03.2017, 23:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2017, 23:19
Привет! Вот еще темы с ответами:

Поиск файлов С++ - C++
Помогите плиз поправить код!!! Т.е чтоб прога выводила все текстовики в данном каталоге!!! #include&lt;iostream&gt; #include &lt;windows.h&gt; ...

Узнать тип файла по его расширению - C++
Здравствуйте, собственно вот что требуется: имея полный путь к файлу и его расширение узнать тип файла, например для .mp3/.flac/.m4a и...

Поиск файлов в Windows на С++ - C++
Здравствуйте, заранее прошу прощения, если неправильно выбрал тематику. Написал собственный поисковик, пускай и не идеальный. Вопрос...

Поиск файлов в директории - C++
Добрый день. Что прошу: Есть exe, при запуске он должен найти все папки в этой директории и скопировать себя в них. С помощью чего...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.