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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 129
#1

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

30.04.2015, 01:23. Просмотров 2321. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2015, 01:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить список файлов в каталоге (C++):

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

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

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

Получить список файлов и папок - C++
Имеется строка в которой содержится адрес некоторой папки. Как можно получить список всех файлов и подпапок в данной папке?

Получить список файлов в директории - C++
Всем доброго времени суток. Я хочу получить список файлов в директории любым способом, но не залезая в WinAPI. На ум приходит только...

Получить список файлов и папок в директории - C++
Вот такой вопрос возник, допустим я хочу написать что то типа файлового менеджера, как мне получить текущий список файлов и папок в...

18
nmcf
5754 / 5065 / 1733
Регистрация: 14.04.2014
Сообщений: 20,749
30.04.2015, 07:54 #2
Проще не получится, и так всё просто. В 12-й строке поиск первого, затем в цикле просмотр остальных. Только здесь каталоги отбираются, тебе надо атрибуты файлов задать вместо FILE_ATTRIBUTE_DIRECTORY.
0
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 129
30.04.2015, 13:47  [ТС] #3
nmcf, А как это правильно сделать? Где лучше об этом прочитать?
0
Ilot
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
30.04.2015, 14:44 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
russian_pepper, не там ищите.
Побегайло Системное программирование в Windows
0
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 129
05.05.2015, 15:26  [ТС] #5
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
nmcf
5754 / 5065 / 1733
Регистрация: 14.04.2014
Сообщений: 20,749
05.05.2015, 15:55 #6
NORMAL - это когда совсем без атрибутов. Сними все флажки в проводнике у файла и попробуй поиск.
1
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 129
05.05.2015, 16:21  [ТС] #7
nmcf, Здравствуйте!
Тогда ещё вопрос: У меня совсем другая программа пишет информацию в разные файлы на Qpile. Никаких установок в языке по атрибутам файлов нет. Просто пишет по умолчанию как-то и всё данные в том формате в котором я указал. Чем определяются атрибуты файлов в таком случае? Это Windows определяет или что-то ещё? Как эти атрибуты вообще появляются если я никогда нигде явно не указываю их? У меня около 8000 этих файлов и мне надо правильно их обработать, раньше такого никогда не делал...
0
nmcf
5754 / 5065 / 1733
Регистрация: 14.04.2014
Сообщений: 20,749
05.05.2015, 16:46 #8
Ну архивный атрибут автоматически устанавливается по-видимому, атрибут сжатия может наследоваться от папки или вручную устанавливаться и т. д. Можешь просто взять все атрибуты, связанные с файлами на диске, и так отбирать.
1
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 129
08.05.2015, 00:38  [ТС] #9
Здравствуйте!
Подскажите, как в программе выше правильно сделать, чтобы передавать разные маски в FindFirstFileA.
Просто объявить, например:
C++
1
string s = "D:\\temp\\*_??.??.????.csv";
и вписать:
C++
1
hf = FindFirstFileA(s, &findData);
не получается.
У меня всего пока две разных маски и конечно могу два раза повторить нужный фрагмент программы, но хотелось бы понять, как сделать красиво и правильно...
0
Ilot
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
08.05.2015, 07:30 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
hf = FindFirstFileA(s.c_str(), &findData);
0
nmcf
5754 / 5065 / 1733
Регистрация: 14.04.2014
Сообщений: 20,749
08.05.2015, 10:02 #11
Вообще-то FindFirstFileA() - это из музея. Пора уже FindFirstFileW() использовать.
1
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 129
08.05.2015, 15:17  [ТС] #12
Ilot, Здравствуйте!
Подскажите пожалуйста, как правильно это сделать в моём случае? FindFirstFileW() в книге которую мне рекомендовали выше нет, посмотрел Go To Definition, там всё так же как и у FindFirstFileA, это всё, на что ума пока хватило...
Можете подсказать, что к чему, где это лучше посмотреть? На разных форумах где упоминается FindFirstFileW() и FindFirstFileA(), понял, только что связано что-то с кодировкой, но примеров понятных для себя не нашёл.
0
nmcf
5754 / 5065 / 1733
Регистрация: 14.04.2014
Сообщений: 20,749
08.05.2015, 15:24 #13
Программа будет по сути такая же, только с поддержкой Unicode. Вместо char используй wchar_t, вместо string - wstring и т. п.
0
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 129
08.05.2015, 16:11  [ТС] #14
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_traits<wchar_t>,std::allocator<wchar_t>>'

В чём ошибка?
0
nmcf
5754 / 5065 / 1733
Регистрация: 14.04.2014
Сообщений: 20,749
08.05.2015, 18:49 #15
Про 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
08.05.2015, 18:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2015, 18:49
Привет! Вот еще темы с ответами:

Получить список файлов в заданной директории - C++
Доброго времени суток! Раздобыл код с получением списком файлов: #include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; ...

Как в С++ или MFC получить список файлов? - C++
Как в С++ или MFC получить список файлов (желательно всетаки в С++)?

Получить список имен файлов в порядке возрастания количества слов в них - C++
Задание: Имеется три заданных текстовых файлов. Получить список имен файлов в порядке возрастания количества слов в них. Результат работы...

Как можно в С++ получить список файлов и папок какого-то диска или папки? - C++
Как можно в С++ получить список файлов и папок какого-то диска или папки?


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

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

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