简体   繁体   中英

Using built in Windows Methods to get Contents of Folder

My goal is to only use built in methods of C++/Windows (I don't think std::filesystem is supported on my version of C++) to get the filenames within a folder.

right now I have this:

HANDLE hFind;
    WIN32_FIND_DATA data;
    hFind = FindFirstFile("C:\\Folder\\*", &data);
    if (hFind != INVALID_HANDLE_VALUE) {
        do {
            //Process File Name
            std::wstring ws(data.cFileName);
        } while (FindNextFile(hFind, &data));
        FindClose(hFind);
    }

Which seems to be returning blank names and not the names of the files in the folder.

Am I using this FindFirstFile function correctly? Is there a better way to do this?

Your code can't compile as shown. You are calling the ANSI version of FindFirstFile() (by virtue of you passing it a narrow ANSI string literal instead of a wide Unicode string literal), and std::wstring does not have a constructor that accepts a char[] as input.

Baring that mistake, you are also ignoring the data.dwFileAttributes field to distinguish between files and subfolders, and in the case of subfolders you are not checking the contents of data.cFileName to ignore the "." and ".." special folder names.

Try this:

WIN32_FIND_DATAW data;
HANDLE hFind = FindFirstFileW(L"C:\\Folder\\*", &data);
if (hFind != INVALID_HANDLE_VALUE)
{
    do
    {
        if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
        {
            // Process File Name
            std::wstring ws(data.cFileName);
            ...
        }
        else
        {
            if ((lstrcmpW(data.cFileName, L".") != 0) &&
                (lstrcmpW(data.cFileName, L"..") != 0))
            {
                // Process Folder Name
                std::wstring ws(data.cFileName);
                ...
            }
        }
    }
    while (FindNextFileW(hFind, &data));
    FindClose(hFind);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM