簡體   English   中英

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

[英]List all text files in directory in C++

我正在嘗試將所有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;
}

FindFirstFile已經具有第一個有效的句柄。 如果立即調用FindNextFile則第一個句柄將丟失。 您的示例中的文件計數將是錯誤的。

使用do-while循環代替。

此外,必須使用FindClose關閉從FindFirstFile獲取的句柄。

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;

使用std::vectorstd::wstring來存儲項目

#include <string>
#include <vector>

...
std::vector<std::wstring> vs;
HANDLE hFind;
hFind = FindFirstFile(file, &FindFileData);
if (hFind != INVALID_HANDLE_VALUE) 
{
    do {
        vs.push_back(FindFileData.cFileName);
    } while (FindNextFile(hFind, &FindFileData));
    FindClose(hFind);
}

std::cout << "count:" << vs.size() << "\n";
for (auto item : vs)
    std::wcout << item << "\n";

對於某些較早的編譯器,可能無法使用auto ,請改用auto

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

注意,Windows API使用c字符串。 在許多情況下,您必須使用.c_str()獲得字符數組。 例如:

if (vs.size())
{
    std::wstring str = vs[0];
    MessageBox(0, str.c_str(), 0, 0);
}

這是使用新的ISO標准文件系統庫TS (技術規范)的可移植版本,適用於那些支持該標准的編譯器:

#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';
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM