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

Функция поиска файлов, и вывод списка найденных (использую FindFirstFile, FindNextFile)

20.10.2015, 13:27. Показов 4858. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья, возникла следующая сложность, написал функцию для поиска файлов(.txt) в текущей директории, название файлов нейзвестно, поэтому, с помощью FindFirstFile, я находил файл, запихивал его имя в std::string затем функция возвращала указатель на эту строку, указатель благополучно запихивался в ifstream, и файл открывался..., всё было чудесно и прекрасно пока я не решил модернезировать эту функцию(ибо файлов то может быть найдено несколько, а работать надо с определённым), эту проблему я решил осилить очевидным мне на тот момент способом - создать массив string'ов затем под конец функции вывести их на экран, и с помощью консоли выбрать нужный номер строки с названием cin >> n; соответственно функция возвращает указатель именно на эту строку, чтоб не быть пустословным вот полный код функции которая у меня получилась...
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
/*ФУНКЦИЯ составляет список файлов с ИД*/
string* findFiles(){
    int i;// счётчик для циклов
    int j = 0;
    string** strList = new string*; //выделяем память под массив указателей на string
    WIN32_FIND_DATA FindFileData;
 
    /* ИЩЕМ ПЕРВЫЙ ФАЙЛ.*/
    HANDLE oneFileName = FindFirstFile("*.txt", &FindFileData); //ищем .txt'эшные файлы
    if (oneFileName == INVALID_HANDLE_VALUE){
        printf("FindFirstFile failed (%u)\n", GetLastError()); //выводим если не нашли ничего
    }
    else{ /*..............Иначе записываем в strList.*/
        for (i = 0; FindFileData.cFileName[i] != '\0'; i++)
            strList[j] = new string; // выделяем память
            strList[j++]->push_back(FindFileData.cFileName[i]);/*Записываем что нашли...собственно
                                                               как выяснится позже, ничерта не записывается,
                                                               как мне кажется проблема в LPCWSTR(тип, возвращаемый
                                                               FindFileData.cFileName[i]), мало того, мне пршлось
                                                               в настройках проекта поменять кодировку с юникода на 
                                                               мультибитную чтобы LPCWSTR воспринимался "в серьёз"*/
    }
    /* ИЩЕМ СЛЕДУЮЩИЕ ФАЙЛЫ.*/
    do {
        if (FindNextFile(oneFileName, &FindFileData)){
            /*..............Иначе записываем в strList.*/
            for (i = 0; FindFileData.cFileName[i] != '\0'; i++)
                strList[j] = new string; // выделяем память
                strList[j++]->push_back(FindFileData.cFileName[i]);/*Записываем что нашли... ну понятно, тут таже проблема,
                                                                   читайте выше*/
        }
    } while (GetLastError() != ERROR_NO_MORE_FILES); // делать пока не обнаружит ни одного файла
    FindClose(oneFileName);
    /* Смотрим что нашли*/
    for (i = 0; i < j; i++){
        printf("%d) %s\n", i, strList[i]->c_str()); /* тут выводится только нумерация и пустота(VS2008) 
                                                    или нумерация и кракозябры(англ. буквы)(VS2013)*/
    }
    /*Выбираем нужный для работы файл*/
    cin >> i;
    return strList[i]; /*Возвращаем нужный указатель*/
}
Самое смешное, пока писал на VS2013 проблема была только в том что в strList ничего не заносилось(я расценил вывод кракозябр именно так), затем, волей судьбы я пересел за другой компьютер (там VS2008) и появилась еще гора проблем в виде
cannot convert parameter 1 from 'std::string *' to 'const char *' (мне начало казаться VS2013 слишком много на себя берёт)
однако с этими неприятными моментами я, как выможете убедиться, справился, но проблему отсутствия записи LPCWSTR в массив стрингов у меня осилить вот уже несколько часов не получается.
Друзья помогите советом, может я тупо в синтаксисе ошибся, или проблема глобальнее, или может я вообще творю не понятно что, и есть более легкие инструменты реализации того что я задумал..., короче говоря... не сдерживайте себя!!! научите меня уму разуму.
Вот еще кусок кода из мэйна - вход в функцию и выход с открытием файла.
C++
1
2
3
ifstream openedFile(findFiles()->c_str()); // открываем файл
    if (!openedFile.is_open()) // проверка наличия файла
        cout << "File hasn't found!" << endl;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2015, 13:27
Ответы с готовыми решениями:

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

FindFirstFile FindNextFile
Помогите, пожалуйста: почему работает, но не так, как надо?? компилится, но все время сообщает FindFirstFile failed И еще: как...

FindFirstFile/FindNextFile
В продолжении темы: https://www.cyberforum.ru/cpp-builder/thread386952.html Не получается скопировать, а точнее найти все *.txt...

5
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.10.2015, 14:16
Лучший ответ Сообщение было отмечено Gloat как решение

Решение

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
std::wstring findFiles()
{
    std::vector<std::wstring> strList;
 
    WIN32_FIND_DATAW FindFileData;
 
    /* ИЩЕМ ПЕРВЫЙ ФАЙЛ.*/
    HANDLE oneFileName = FindFirstFileW(L"*.txt", &FindFileData); //ищем .txt'эшные файлы
 
    while (oneFileName != INVALID_HANDLE_VALUE)
    {
        strList.push_back(std::wstring(FindFileData.cFileName));
 
        if (!FindNextFileW(oneFileName, &FindFileData))
        {
            FindClose(oneFileName);
            break;
        }
 
    for (int i = 0; i < strList.size(); ++i) wcout << strList[i] << endl;
    int j;
    wcin >> j;
 
    return strList[j];
}
В самом начале main():
C++
1
2
wcout.imbue(locale("rus_rus.866"));
wcin.imbue(locale("rus_rus.866"));
0
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.10.2015, 14:57  [ТС]
Всё заработало, подозреваю проблема была там где я и думал.
Вопрос - всегда ли стоит использовать общие типы данных и имена (wchar_t, wstring, wcout и т.д.) когда пишешь под винду?
P.S. спасибо за помощь
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.10.2015, 15:02
Общие - это как?
Я за юникод, все эти char устарели.
0
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.10.2015, 15:11  [ТС]
nmcf, И ещё, не реализована ли уже эта функция в каком-либо виде?

Добавлено через 5 минут
nmcf, на хабре в статье автор рекомендует писать не так например "wchar_t a" а вот так "TCHAR a" это он назвал "писать в более общей манере чтоб не заморачиваться о кодировках" он не прав?
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.10.2015, 16:04
Какая функция? Поиск файлов? В стандартных библиотеках нет. Есть что-то подобное в boost.
Ну можно и с TCHAR, если ты знаешь как им пользоваться. Не знаю, в чём это проще, тогда и для string/wstring должно быть общее имя.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.10.2015, 16:04
Помогаю со студенческими работами здесь

FindNextFile,FindFirstFile,FindClose
#include &lt;windows.h&gt; #include &lt;iostream&gt; #include&lt;tchar.h&gt; using namespace std; //strcpy, strcat //_tcscpy,_tcscat int...

FindFirstFile, FindNextFile и setLocale
Пытался пройти по файлам в каталоге, как в примере на MSDN. Написал такой код #include &lt;windows.h&gt; #include &lt;iostream&gt; ...

Рекурсивный обход (FindFirstFile, FindNextFile)
Здравствуйте. Перед мной стоит задача выполнить поиск и некоторую работу со всеми файлами в определенном каталоге, количества директорий и...

FindFirstFile, FindNextFile в сетевом ресурсе
Для удобства пользования сетевым ресурсом сделал программу, собирающую в БД все директории удаленного каталога. Проблема в том что связь с...

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


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

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

Новые блоги и статьи
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru