Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/92: Рейтинг темы: голосов - 92, средняя оценка - 4.77
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152

Получить список файлов в каталоге

30.04.2015, 01:23. Показов 18261. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Мне нужно получить список файлов в каталоге, чтобы потом как-то работать с этими файлами, для начала, отсортировать их по дате, которая есть в названии файла в формате *_ЧЧ.ММ.ГГГГ_*. Во всех видеоуроках и книгах, которые мне попадают, хорошо описан только ввод-вывод из файла. Подскажите, где лучше всего описана работа с файлами в каталоге. Нашёл готовый пример, вроде бы можно воспользоваться, но хотелось бы хорошо понимать, как тут всё работает...
Искал HANDLE и WIN32_FIND_DATAA у Б. Пахомова, Т, А. Павловской, Шилдта, Прата, нашёл только у А. Хортона Visual C++ 2010. Полный курс, сказано (handle) это дескриптор, подобие указателя, но что к чему и зачем пока не понимаю. Помогите кто-нибудь объясните, как пример ниже работает, или что прочитать нужно, возможно в моём случае, только для считывания имён файлов из каталога, всё ещё проще чем в примере ниже решается?
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
#include <iostream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    WIN32_FIND_DATAA findData;
    HANDLE hf;
 
    hf = FindFirstFileA("D:\\MyDocs\\*", &findData);
 
    if (hf == INVALID_HANDLE_VALUE)
    {
        cout << "Cannot find file" << endl;
        return -1;
    }
 
    do
    {
        if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            cout << "[DIR] ";
            
        cout << findData.cFileName << endl;
    }
    while (FindNextFileA(hf, &findData)); 
 
    FindClose(hf);
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2015, 01:23
Ответы с готовыми решениями:

Список файлов в каталоге
Добрый день. Хочу получить список файлов из папки, решение ниже работает, но в результате выполнения по мимо файлов в папке catalog...

Вывести список файлов в каталоге
Напишите программу, которая составляет список файлов, расположенных в каталоге, имя которого задается в командной строке и создает...

Список файлов в указанном каталоге
Использую функцию FindFirstFile: hf = FindFirstFile(L&quot;c:\\folder\\*&quot;, &amp;FindFileData); Такой вопрос: как вместо...

18
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.04.2015, 07:54
Проще не получится, и так всё просто. В 12-й строке поиск первого, затем в цикле просмотр остальных. Только здесь каталоги отбираются, тебе надо атрибуты файлов задать вместо FILE_ATTRIBUTE_DIRECTORY.
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
30.04.2015, 13:47  [ТС]
nmcf, А как это правильно сделать? Где лучше об этом прочитать?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
30.04.2015, 14:44
Лучший ответ Сообщение было отмечено russian_pepper как решение

Решение

russian_pepper, не там ищите.
Побегайло Системное программирование в Windows
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
05.05.2015, 15:26  [ТС]
Ilot, Здравствуйте!
Книгу хорошую подсказали, спасибо, но в процессе изучения ещё вопрос возник...
Вариант ниже в переменной k считает директории правильно, вопросов нет, но мне нужны файлы.
Когда ставлю FILE_ATTRIBUTE_NORMAL, ничего не считает. Если ставлю FILE_ATTRIBUTE_ARCHIVE, то находит все мои файлы которые мне нужны, но когда смотрю в свойствах файлов, галочки в атрибутах "Только чтение" нет, а в дополнительных атрибутах галка в поле "Файл готов для архивирования" и "Разрешить индексировать содержимое...
В чём причина?
Файл готов для архивирования - это и есть ARCHIVE?
А какие тогда фалы должны находиться если file_attribute_normal записать?
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
#include <iostream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    WIN32_FIND_DATAA findData;
    HANDLE hf;
    
    hf = FindFirstFileA("D:\\temp\\*", &findData);
 
    if (hf == INVALID_HANDLE_VALUE)
    {
        cout << "Cannot find file" << endl;
        return -1;
    }
int k = 0;
    do
    {
        if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            cout << k << ' ' << "[DIR] ";
            k++;
        }
 
        cout << findData.cFileName << endl;
 
    } while (FindNextFileA(hf, &findData));
cout << k << endl;
 
    FindClose(hf);
    system("pause");
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.05.2015, 15:55
NORMAL - это когда совсем без атрибутов. Сними все флажки в проводнике у файла и попробуй поиск.
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
05.05.2015, 16:21  [ТС]
nmcf, Здравствуйте!
Тогда ещё вопрос: У меня совсем другая программа пишет информацию в разные файлы на Qpile. Никаких установок в языке по атрибутам файлов нет. Просто пишет по умолчанию как-то и всё данные в том формате в котором я указал. Чем определяются атрибуты файлов в таком случае? Это Windows определяет или что-то ещё? Как эти атрибуты вообще появляются если я никогда нигде явно не указываю их? У меня около 8000 этих файлов и мне надо правильно их обработать, раньше такого никогда не делал...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.05.2015, 16:46
Ну архивный атрибут автоматически устанавливается по-видимому, атрибут сжатия может наследоваться от папки или вручную устанавливаться и т. д. Можешь просто взять все атрибуты, связанные с файлами на диске, и так отбирать.
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
08.05.2015, 00:38  [ТС]
Здравствуйте!
Подскажите, как в программе выше правильно сделать, чтобы передавать разные маски в FindFirstFileA.
Просто объявить, например:
C++
1
string s = "D:\\temp\\*_??.??.????.csv";
и вписать:
C++
1
hf = FindFirstFileA(s, &findData);
не получается.
У меня всего пока две разных маски и конечно могу два раза повторить нужный фрагмент программы, но хотелось бы понять, как сделать красиво и правильно...
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
08.05.2015, 07:30
Лучший ответ Сообщение было отмечено russian_pepper как решение

Решение

C++
1
hf = FindFirstFileA(s.c_str(), &findData);
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.05.2015, 10:02
Вообще-то FindFirstFileA() - это из музея. Пора уже FindFirstFileW() использовать.
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
08.05.2015, 15:17  [ТС]
Ilot, Здравствуйте!
Подскажите пожалуйста, как правильно это сделать в моём случае? FindFirstFileW() в книге которую мне рекомендовали выше нет, посмотрел Go To Definition, там всё так же как и у FindFirstFileA, это всё, на что ума пока хватило...
Можете подсказать, что к чему, где это лучше посмотреть? На разных форумах где упоминается FindFirstFileW() и FindFirstFileA(), понял, только что связано что-то с кодировкой, но примеров понятных для себя не нашёл.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.05.2015, 15:24
Программа будет по сути такая же, только с поддержкой Unicode. Вместо char используй wchar_t, вместо string - wstring и т. п.
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
08.05.2015, 16:11  [ТС]
string - wstring понятно, а где тут char ?

Добавлено через 45 минут
Заменил:
WIN32_FIND_DATAA findData; на WIN32_FIND_DATAW findData;
string... на wstring s = "D:\\temp\\*_??.??.????.csv";
hf = FindFirstFileA(s.c_str(), &findData); на hf = FindFirstFileW(s.c_str(), &findData);
while (FindNextFileA(hf, &findData)); на while (FindNextFileW(hf, &findData));

подчёркивает "D:\\temp\\*_??.??.????.csv";
Error 1 error C2440: 'initializing' : cannot convert from 'const char [25]' to 'std::basic_string<wchar_t,std::char_tra its<wchar_t>,std::allocator<wchar_t>>'

В чём ошибка?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.05.2015, 18:49
Про L у строковых констант не забывай и про W у функций и структур при необходимости.
C++
1
2
3
4
WIN32_FIND_DATAW findData;
wstring s = L"D:\\temp\\*_??.??.????.csv";
hf = FindFirstFileW(s.c_str(), &findData);
while (FindNextFileW(hf, &findData));
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
08.05.2015, 19:43  [ТС]
Так в результате выдаётся адрес 004FF7FC, а раньше название файла выводилось, что-то ещё не так....
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
#include <iostream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    WIN32_FIND_DATAW findData;
    HANDLE hf;
    wstring s = L"D:\\temp\\*_??.??.????.csv";
    hf = FindFirstFileW(s.c_str(), &findData);
 
    if (hf == INVALID_HANDLE_VALUE)
    {
        cout << "Cannot find file" << endl;
        return -1;
    }
    int k = 0;
    do
    {
        if (findData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)
        {
            k++;
            cout << findData.cFileName << endl;
        }
    } while (FindNextFileW(hf, &findData));
    cout << k << endl;
 
    FindClose(hf);
    system("pause");
}
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.05.2015, 20:02
wcout вместо cout.
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
08.05.2015, 20:46  [ТС]
nmcf, Спасибо, всё работает!
Не сочтите за труд, объясните, такие вещи нужно узнавать и запоминать или как-то легко можно догадаться?
Мне когда написали что лучше FindFirstFileW() вместо FindFirstFileA()использовать, то часть я догадался и исправил правильно по подсказкам в VS, но вот L пропустил в wstring s = L"D:\\temp\\*_??.??.????.csv"; и wcout вместо cout, тоже не знал...
Это можно было как-то догадаться или найти VisualStudio или только перебирать в сети кучу примеров и смотреть похожие на свою задачу?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.05.2015, 23:20
Догадаться о чём? Широкие строки и символы идут с префиксом L - это стандарт. Широкие потоки wcout и wcin тоже есть в С++, если читать не древние книжки.
Есть ещё макрос _T() вроде бы для VS, который зависит от того, включен или нет Unicode в свойствах проекта.
Функции тоже будут подставляться соответствующие если явно не указано.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.05.2015, 23:20
Помогаю со студенческими работами здесь

Вывод на экран список файлов и название программ С++ , находящимся в указанном при запуске программы каталоге
Добрый день! Помогите пожалуйста: Написать программу, которая выведет на экран список файлов и название программ С++ ,...

Получить список файлов в каталоге
как получить вписок файлов и их свойств (например дату изменения) в известном каталоге?

Получить список файлов в определенном каталоге
ДД! Как-то можно получить список всех файлов в определенном каталоге?

Получить список файлов в каталоге и подкаталогах
В ведённом каталоге включая подкаталоги нужно получить список файлов. Файлы размером которых меньше 40 байт, удалить, а к имени прочих...

Получить список файлов в указанном каталоге
Как получить список файлов в указаном каталоге? И находить файлы с указаным расширением или именем? Пример: В каталоге D:\test...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru