Имя: Пароль:
IT
 
Как в C++ получить список файлов в каталоге.
0 megabax
 
26.02.17
15:24
Добрый день. подскажите пожалуйста, как в С++ получить список файлов в каталоге. Делаю так:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "Core.h"

#include <Windows.h>
#include <conio.h>

using namespace std;
using namespace cv;

FILE* fp;


int main(int argc, char *argv[])
{

    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
    LPCWSTR s = L"d:\\3\\*.jpg";
    hf = FindFirstFile(s, &FindFileData);
    if (hf != INVALID_HANDLE_VALUE) {
        do {
            printf("%s\n", FindFileData.cFileName);
        } while (FindNextFile(hf, &FindFileData) != 0);
        FindClose(hf);
    }
    getch();
    return 0;
...

И в ответ получаю кучу ошибок типа:
Серьезность    Код    Описание    Проект    Файл    Строка    Состояние подавления
Ошибка (активно)        "ACCESS_MASK" не является однозначным    BlaSimulator    c:\Program Files (x86)\Windows Kits\8.1\Include\um\winioctl.h    5644    

Если закоментить #include <Windows.h> ошибки исчезают, но тогда недоступно FindFirstFile. Подскажите,пожалуйста, есть ли другой способ или как заставить нормально инклюдиться <Windows.h>
?
1 lock19
 
26.02.17
16:35
Если бы я с каждым затыком задавал вопрос на форумах, интернет бы уже переполнился.
2 Dotoshin
 
26.02.17
17:18
3 Фрэнки
 
26.02.17
17:21
посмотреть "как можно" можно. Но не очень интересно, т.к. твои включаемые файлы говорят о том, что там включена винда. Ну так смотри в подсказке этой среды разработчика, в которой сидишь.

Есть статья https://habrahabr.ru/company/microsoft/blog/155619/

мелксофт выкупил имя мсдн.ру и оно теперь приводит на ссылки типа той, что в (2) второй ссылкой.
Прикрывается лавочка халявного программинга на форточках, увы.
4 ERWINS
 
26.02.17
17:25
никак

в стандарте с++ такой функции нет
5 spock
 
26.02.17
17:27
(1) Там так не считают: http://stackoverflow.com/
6 lock19
 
26.02.17
17:31
(5) В подавляющем большинстве случаев достаточно полистать этот самый stackoverflow. Так же бывают специфические вопросы, которые мало кто решал.
А товарищ из (0) очень смахивает на тролля.
7 Помогите
 
26.02.17
17:32
(3) >> Прикрывается лавочка халявного программинга на форточках, увы.

откуда такие выводы?
8 trdm
 
26.02.17
17:39
(0) Обязательно на WIN API лабать? МФЦ есть, есть и многое другое.
9 Фрэнки
 
26.02.17
17:40
(7) винда маст дай - все выводы только оттуда
10 jsmith82
 
26.02.17
17:47
вин апи, мфц.. старьё
нет фрейморк
string[] dirs = Directory.GetDirectories(path);
11 jsmith82
 
26.02.17
17:47
то есть
string[] files = Directory.GetFiles(path);
12 trdm
 
26.02.17
17:50
Пишем правильно:
#define начал {
#define кончил }
#define УРОДСТВО HANDLE
#define сматываемся return
#define НИФИГА 0
#define СТРИНГИ LPCWSTR

int main(int argc, char *argv[])
начал

    WIN32_FIND_DATA FindFileData;
    УРОДСТВО hf;
    СТРИНГИ s = L"d:\\3\\*.jpg";
    hf = FindFirstFile(s, &FindFileData);
    if (hf != INVALID_HANDLE_VALUE) начал
        do начал
            printf("%s\n", FindFileData.cFileName);
        кончил while (FindNextFile(hf, &FindFileData) != НИФИГА);
        FindClose(hf);
    кончил
    getch();
    сматываемся НИФИГА;
кончил
13 spock
 
26.02.17
17:52
14 jsmith82
 
26.02.17
17:52
(12) Всё это речитативом под смачный бит
15 lock19
 
26.02.17
17:52
(11)
#include <boost/filesystem.hpp>
#include <iostream>

using namespace boost::filesystem;

int main()
{
  path p = current_path();
  directory_iterator it{p};
  while (it != directory_iterator{})
    std::cout << *it++ << '\n';
}
16 lock19
 
26.02.17
17:54
В следующих главах ждём вопросов об установке буста на винду.
17 Провинциальный 1сник
 
26.02.17
17:59
18 Провинциальный 1сник
 
26.02.17
18:00
(17) То есть удали "using namespace std;" и попробуй.
19 trdm
 
26.02.17
18:02
QApplication::processEvents();
    QDir dir(QString::fromUtf8("d:\\3\\"));
    QString mask = "*.jpg";
    QStringList listFiles =
        dir.entryList(mask.split(" "), QDir::Files);
    QStringList li;
    foreach (QString file, listFiles) {
        li->append(dir.absoluteFilePath(file));
    }
20 trdm
 
26.02.17
18:27
Последние 4 строчки - лишние.
22 Serginio1
 
26.02.17
18:47
#include "Util.h"

// Function to check the endig of a string
bool HasEnding(wstring const &fullString, wstring const &ending)
{
    if (fullString.length() >= ending.length())
        return (0 == fullString.compare(fullString.length() - ending.length(), ending.length(), ending));
    else
        return false;
}

// Function to list all files in a specific directory with a specified pattern
vector<wstring> ListFilesInDirectoryByPattern(LPCWSTR directoryName)
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = ::FindFirstFile(directoryName, &FindFileData);

    vector<wstring> result;

    result.push_back(wstring(FindFileData.cFileName));

    while (FindNextFile(hFind, &FindFileData))
        result.push_back(wstring(FindFileData.cFileName));

    return result;
}
23 jsmith82
 
26.02.17
19:06
Посоны, а чо за древние библиотеки? Qt ещё приплели. Это потому что линух? На линухе годноты нет?
24 Провинциальный 1сник
 
26.02.17
19:29
(23) Если писать на чистом винапи - то будет работать везде, даже под линуксом в вайне.
25 NorthWind
 
26.02.17
20:57
в С++Builder я искал файлы точно таким способом, как ТС. Все работало.

        TPtr <TStringList> slFileList = new TStringList ();
        for (int iDay = FScanDaysTo; iDay >= FScanDaysFrom; iDay --) {

                (FBillDate + iDay).DecodeDate(&yy, &mm, &dd);

                // формируем маску для поиска
                String FileName = sFolder + String ().sprintf ("recadv_%04u%02u%02u*.xml", yy, mm, dd);

                WIN32_FIND_DATA fd;

                HANDLE hFF = FindFirstFile (FileName.c_str (), &fd);

                if (hFF != INVALID_HANDLE_VALUE) {
                        slFileList->Add (fd.cFileName);
                        for (bool fResult = true; fResult;) {
                                fResult = FindNextFile (hFF, &fd);
                                if (fResult)
                                        slFileList->Add (fd.cFileName);
                        }
                        FindClose (hFF);
                }
        }
26 organizm
 
26.02.17
21:06
boost рулит.

а так можно getcwd
27 NorthWind
 
26.02.17
21:12
сказать честно, я не очень понимаю - если пишешь под винду, то почему стандартные виндовые способы не работают. Единственное что приходит в голову - ACCESS_MASK где-то в других хидерах объявлен ранее чем в windows.h. (0) - попробуй оставить только те хидеры, которые нужны. В данном случае нужно windows.h, stdio.h, conio.h (для getch()) и вроде больше ничего. Неймспейсы от std и cv тоже убери от греха подальше. И посмотри, как соберется.
28 NorthWind
 
26.02.17
21:22
еще не очень понятно - у вас строка с маской юникодная (LPCWSTR), а передаете вы ее зачем-то в неюникодную функцию (FindFirstFile вместо FindFirstFileW). Ну да здесь дело не в этом. Хидеры убирайте и смотрите что будет получаться.
29 Помогите
 
01.03.17
17:11
(9) Она уже больше 20 лет как маст дай. Но как связаны твои пожелания с действительностью?