C++ 列出C+中目录中的所有文本文件+;

C++ 列出C+中目录中的所有文本文件+;,c++,windows,file,C++,Windows,File,我试图将目录中所有txt文件的名称以字符串形式存储并打印出来。我需要计算目录中txt文件的数量,然后打印名称。计数的部分是有效的,但我似乎无法让这个名字起作用。我发现了一些示例,但它们在我使用的visual studio中不起作用 这是我的密码 int main() { bool x = true; int i = 0; wchar_t* file = L"../Menu/Circuitos/*.txt"; WIN32_FIND_DATA FindFileDa

我试图将目录中所有txt文件的名称以字符串形式存储并打印出来。我需要计算目录中txt文件的数量,然后打印名称。计数的部分是有效的,但我似乎无法让这个名字起作用。我发现了一些示例,但它们在我使用的visual studio中不起作用

这是我的密码

int main() {

    bool x = true;
    int i = 0;

    wchar_t* file = L"../Menu/Circuitos/*.txt";
    WIN32_FIND_DATA FindFileData;

    HANDLE hFind;

    hFind = FindFirstFile(file, &FindFileData);

    if (hFind != INVALID_HANDLE_VALUE) {

        i++;

        while ((x = FindNextFile(hFind, &FindFileData)) == TRUE) {
            i++;
        }
    }

    cout << "number of files " << i << endl;

    return 0;
}
intmain(){
布尔x=真;
int i=0;
wchar_t*file=L“./Menu/Circuitos/*.txt”;
WIN32_FIND_DATA FindFileData;
处理高频风;
hFind=FindFirstFile(文件和FindFileData);
if(hFind!=无效的句柄值){
i++;
while((x=FindNextFile(hFind,&FindFileData))==TRUE){
i++;
}
}

cout
FindFirstFile
已具有第一个有效句柄。如果立即调用
FindNextFile
,则第一个句柄将丢失。示例中的文件计数将是错误的

在循环istead时使用
do

此外,从
FindFirstFile
获取的句柄必须使用
FindClose

HANDLE hFind;
hFind = FindFirstFile(file, &FindFileData);
if (hFind != INVALID_HANDLE_VALUE) 
{
    do {
        wcout << FindFileData.cFileName << "\n";
        i++;
    } while (FindNextFile(hFind, &FindFileData));
    FindClose(hFind);
}
cout << "number of files " << i << endl;
对于某些较旧的编译器,
auto
可能不可用,请改用它

for (int i = 0; i < vs.size(); i++)
    std::wcout << vs[i] << "\n";

以下是一个便携式版本,使用新的
ISO
标准(技术规范),适用于具有支持该标准的编译器的用户:

#include <vector>
#include <iostream>
#include <algorithm>
#include <experimental/filesystem>

// for readability
namespace fs = std::experimental::filesystem;

/**
 * Function object to test directory entries
 * for a specific file extension.
 */
struct file_extension_is
{
    std::string ext;

    file_extension_is(std::string const& ext): ext(ext) {}

    bool operator()(fs::directory_entry const& entry) const
    {
        return entry.path().extension() == ext;
    }
};

int main(int, char* argv[])
{
    try
    {
        // directory supplied on the command line if present
        // else current directory
        fs::path dir = argv[1] ? argv[1] : ".";

        // place to store the results
        std::vector<fs::directory_entry> entries;

        // copy directory entries that have file extension ".txt"
        // to the results
        fs::directory_iterator di(dir);
        fs::directory_iterator end;

        std::copy_if(di, end, std::back_inserter(entries),
            file_extension_is(".txt"));

        // print it all out

        std::cout << "Number of files: " << entries.size() << '\n';

        for(auto const& entry: entries)
            std::cout << entry.path().string() << '\n';
    }
    catch(std::exception const& e)
    {
        std::cerr << e.what() << '\n';
    }
    catch(...)
    {
        std::cerr << "Unknown exception." << '\n';
    }
}
#包括
#包括
#包括
#包括
//为了可读性
命名空间fs=std::实验::文件系统;
/**
*用于测试目录项的函数对象
*对于特定的文件扩展名。
*/
结构文件扩展名为
{
std::字符串扩展;
文件扩展名是(std::string const&ext):ext(ext){
bool运算符()(fs::directory\u entry const&entry)const
{
返回条目.path().extension()==ext;
}
};
int main(int,char*argv[]
{
尝试
{
//命令行上提供的目录(如果存在)
//else当前目录
fs::path dir=argv[1]?argv[1]:“;
//存储结果的位置
std::向量条目;
//复制文件扩展名为“.txt”的目录项
//结果如何
目录迭代器di(dir);
fs::directory_迭代器end;
std::copy_if(di,end,std::back_插入器(条目),
文件扩展名为(“.txt”);
//全部打印出来

std::cout-Yikes。你能对你的代码执行
Ctrl+K
然后
Ctrl+D
,然后再发布一次吗?你说的“我似乎无法让这个名字工作”到底是什么意思?有
cFileName
。它是空的吗?顺便说一句,你应该检查
文件属性\目录
是否应该是
。//Menu//Circuitos//*.txt
?计数器工作得很好。它正在计算txt文件的数量,因此路径必须工作。cFileName返回一些我不知道如何将其转换为字符串的内容,并且只返回一个值,但目录中有多个文本文件。现在它确实给了我一个文件的名称,但只有一个名称。它应该给我t循环中找到的所有文件的名称。不要紧,它也适用于我如何存储在字符串中?您可以针对每个主题问一个问题。主要问题“我正在尝试将目录中所有txt文件的名称存储在字符串中并打印出来”中有说明,但谢谢
if (vs.size())
{
    std::wstring str = vs[0];
    MessageBox(0, str.c_str(), 0, 0);
}
#include <vector>
#include <iostream>
#include <algorithm>
#include <experimental/filesystem>

// for readability
namespace fs = std::experimental::filesystem;

/**
 * Function object to test directory entries
 * for a specific file extension.
 */
struct file_extension_is
{
    std::string ext;

    file_extension_is(std::string const& ext): ext(ext) {}

    bool operator()(fs::directory_entry const& entry) const
    {
        return entry.path().extension() == ext;
    }
};

int main(int, char* argv[])
{
    try
    {
        // directory supplied on the command line if present
        // else current directory
        fs::path dir = argv[1] ? argv[1] : ".";

        // place to store the results
        std::vector<fs::directory_entry> entries;

        // copy directory entries that have file extension ".txt"
        // to the results
        fs::directory_iterator di(dir);
        fs::directory_iterator end;

        std::copy_if(di, end, std::back_inserter(entries),
            file_extension_is(".txt"));

        // print it all out

        std::cout << "Number of files: " << entries.size() << '\n';

        for(auto const& entry: entries)
            std::cout << entry.path().string() << '\n';
    }
    catch(std::exception const& e)
    {
        std::cerr << e.what() << '\n';
    }
    catch(...)
    {
        std::cerr << "Unknown exception." << '\n';
    }
}