c++ - 列出文件夹中的所有文件返回空列表

标签 c++ string file winapi widechar

我指的是 this thread列出文件夹中的所有文件。这是函数:

vector<string> GetFileList(string path)
{
    vector<string> names;

    WIN32_FIND_DATA fd; 

    LPCSTR pathLPCW = path.c_str();
    HANDLE hFind = ::FindFirstFile(pathLPCW, &fd); 

    if(hFind != INVALID_HANDLE_VALUE) 
    { 
        do 
        { 
            // read all (real) files in current folder
            // , delete '!' read other 2 default folder . and ..
            if(! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) 
            {

                string fileName(fd.cFileName);
                names.push_back(fileName);
            }

        } while(::FindNextFile(hFind, &fd)); 

        ::FindClose(hFind); 
    }

    return names;
}

这是它在主程序中的调用方式:

int _tmain(int argc, _TCHAR* argv[])
{
    string path = "D:\\CTData\\64_Slice_Data\\Helical\\fisrt_helical64_data";


    vector<string> fileList = GetFileList(path);
    return 0;
}

但是,我在列表中得到 0 个文件。当我调试时,我发现下面这行 if 条件是错误的。

 if(! (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) 

我不太明白为什么。我明明文件夹里有文件。那么为什么我得到一个空列表?非常感谢。

files in the folder

更新:

我在 while(::FindNextFile(hFind, &fd)) 之后添加了 GetLastError();像下面这样:

while(::FindNextFile(hFind, &fd)); 
        lastError  = GetLastError();

我得到了 ERROR_NO_MORE_FILES' (18) 错误。我很困惑,因为我的文件夹里好像有很多文件?

最佳答案

你的问题是过滤器。基本上 "D:\\CTData\\64_Slice_Data\\Helical\\fisrt_helical64_data" 指向目录本身。您需要将其更改为 "D:\\CTData\\64_Slice_Data\\Helical\\fisrt_helical64_data\\*.*"

如果我正在编写它,我也会避免返回 vector 并将指针传递给要填充的函数。

#include <Windows.h>
#include <vector>
#include <string>

using namespace std;

typedef vector<wstring> TFileList;

void GetFileList(wstring path, TFileList* pFileList)
{
    WIN32_FIND_DATA fd;

    HANDLE hFind = ::FindFirstFile(path.c_str(), &fd);

    if (hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            // read all (real) files in current folder
            // , delete '!' read other 2 default folder . and ..
            if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            {
                wstring fileName(fd.cFileName);
                pFileList->push_back(fileName);
            }

        } while (::FindNextFile(hFind, &fd));

        ::FindClose(hFind);
    }
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    wstring path = {L"D:\\CTData\\64_Slice_Data\\Helical\\fisrt_helical64_data\\*.*"};
    TFileList names;

    GetFileList(path, &names);
    return 0;
}

想象一下,如果您的函数返回 1000 个文件名。您不想创建一次列表,然后将其复制到新位置,然后删除函数中的列表。 同时将 main 函数更改为新格式。

山姆

关于c++ - 列出文件夹中的所有文件返回空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37623726/

相关文章:

c++ - 按字母顺序排序结构数组

java - 使用Java从不同操作系统的字节数组中获取字符串

java - IntelliJ 14 IDEA - 找不到文件的正确路径

c++ - 从 1D 数组表示计算 3D 索引的有效方法

c++ - 如何编写自替换/更新二进制文件?

c++ - 将十进制美元金额从字符串转换为缩放整数

java - 仅在第一个实例上拆分字符串 - java

Java专用IDE : Project files vs project zip/jar

java - 从 eclipse 和 java 中的 .jar 文件打开 xml 文件

c++ - 在 C++ 中调用 ASM 函数