如何获取目录中的所有文件名?

Ben

我正在用C ++编写程序。我正在尝试获取程序可执行文件所在的文件夹中的所有文件,并将它们存储在向量中。有人告诉我下面的代码应该起作用,但是FindFirstFile操作只能找到一个文件(应该在其中搜索文件夹的名称)。如何更改代码,以便正确浏览文件夹?

std::vector<char*> fileArray;

//Get location of program executable
HMODULE hModule = GetModuleHandleW(NULL);
WCHAR path[MAX_PATH];
GetModuleFileNameW(hModule, path, MAX_PATH);

//Remove the executable file name from 'path' so that it refers to the folder instead
PathCchRemoveFileSpec(path, sizeof(path));

//This code should find the first file in the executable folder, but it fails
//Instead, it obtains the name of the folder that it is searching
WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
hFind = FindFirstFile(path, &ffd);

do
{
    //The name of the folder is pushed onto the array because of the previous code's mistake
    //e.g. If the folder is "C:\\MyFolder", it stores "MyFolder"
    fileArray.push_back(ffd.cFileName); //Disclaimer: This line of code won't add the file name properly (I'll get to fixing it later), but that's not relevant to the question
} while (FindNextFile(hFind, &ffd) != 0); //This line fails to find anymore files
雷米·勒博

有人告诉我下面的代码应该工作

有人告诉您错误,因为您提供的代码严重损坏。

FindFirstFile操作只能找到一个文件(应在其中搜索文件夹的名称)。

您仅将文件夹路径本身传递给FindFirstFile(),因此将仅报告一项描述文件夹本身的条目。您需要做的是在路径末尾附加一个**.*通配符,然后FindFirstFile()/FindNextFile()将枚举文件夹中的文件和子文件夹。

除此之外,代码还有其他几个问题。

即使枚举有效,您也无法区分文件和子文件夹。

您将错误的值传递给的第二个参数PathCchRemoveFileSpec()您传入的是字节数,但是它期望字符数。

您无需FindFirstFile()在进入循环之前检查故障,也不必FindClose()在循环结束后进行调用

最后,您的代码甚至无法按原样编译。vector正在存储char*的值,但为了通过一个WCHAR[]FindFirstFile()UNICODE必须定义,该装置FindFirstFile()将映射到FindFirstFileW()WIN32_FIND_DATA将映射到WIN32_FIND_DATAW,因此,cFileName字段将是一个WCHAR[]编译器将不允许WCHAR[](或WCHAR*)分配给char*

尝试类似这样的方法:

std::vector<std::wstring> fileArray;

//Get location of program executable
WCHAR path[MAX_PATH+1] = {0};
GetModuleFileNameW(NULL, path, MAX_PATH);

//Remove the executable file name from 'path' so that it refers to the folder instead
PathCchRemoveFileSpec(path, MAX_PATH);

// append a wildcard to the path
PathCchAppend(path, MAX_PATH, L"*.*");

WIN32_FIND_DATAW ffd;
HANDLE hFind = FindFirstFileW(path, &ffd);
if (hFile != INVALID_HANDLE_VALUE)
{
    do
    {
        if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
            fileArray.push_back(ffd.cFileName);
    }
    while (FindNextFileW(hFind, &ffd));
    FindClose(hFind);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python中获取当前目录中的所有文件名和文件大小

来自分类Dev

使用vim获取目录中的所有文件名

来自分类Dev

如何从目录中的所有文件名中删除“ _”

来自分类Dev

如何从所有子目录中获取特定的文件名?

来自分类Dev

用于获取目录中所有文件名的脚本

来自分类Dev

如何从目录中删除具有特定文件名长度的所有文件?

来自分类Dev

PHP在目录中获取所有文件名以进行页面切换

来自分类Dev

在FTP上的目录中获取所有文件名[Python]

来自分类Dev

如何从目录(包括其子目录)中获取其文件名包含特定字符串的所有文件的列表

来自分类Dev

Inno Setup:列出目录中的所有文件名

来自分类Dev

如何一一获取目录中的文件名?

来自分类Dev

有没有更快的方法来获取和输出目录树中的所有文件名?

来自分类Dev

在F#中:如何获取目录中文件名的列表;预期单位有字串

来自分类Dev

如何使用Spring MVC获取所有文件名?

来自分类Dev

Python获取列表中的所有文件名

来自分类Dev

获取目录路径中的文件名

来自分类Dev

从Bash中的目录获取文件名

来自分类Dev

获取目录中的文件名

来自分类Dev

如何遍历目录中某个文件夹中的所有csv文件名,并对这些文件名执行字符串拆分?

来自分类Dev

如何将所有文件移动(或复制)到具有相同文件名前缀的目录中?

来自分类Dev

如何将所有文件移动(或复制)到具有相同文件名前缀的目录中?

来自分类Dev

获取目录中所有文件的不带扩展名的文件名列表

来自分类Dev

在Linux或Windows中更改目录中的所有文件名和扩展名

来自分类Dev

如何在终端中列出所有文件名?

来自分类Dev

如何列出系统中的所有文件名

来自分类Dev

读入特定目录中的所有文件会在html列表中显示文件名

来自分类Dev

从http目录递归获取所有文件名(不包含内容)

来自分类Dev

如何交换目录中的文件名?

来自分类Dev

如何将所有目录中具有特定文件名的所有文件复制到一个目标位置?

Related 相关文章

  1. 1

    如何在Python中获取当前目录中的所有文件名和文件大小

  2. 2

    使用vim获取目录中的所有文件名

  3. 3

    如何从目录中的所有文件名中删除“ _”

  4. 4

    如何从所有子目录中获取特定的文件名?

  5. 5

    用于获取目录中所有文件名的脚本

  6. 6

    如何从目录中删除具有特定文件名长度的所有文件?

  7. 7

    PHP在目录中获取所有文件名以进行页面切换

  8. 8

    在FTP上的目录中获取所有文件名[Python]

  9. 9

    如何从目录(包括其子目录)中获取其文件名包含特定字符串的所有文件的列表

  10. 10

    Inno Setup:列出目录中的所有文件名

  11. 11

    如何一一获取目录中的文件名?

  12. 12

    有没有更快的方法来获取和输出目录树中的所有文件名?

  13. 13

    在F#中:如何获取目录中文件名的列表;预期单位有字串

  14. 14

    如何使用Spring MVC获取所有文件名?

  15. 15

    Python获取列表中的所有文件名

  16. 16

    获取目录路径中的文件名

  17. 17

    从Bash中的目录获取文件名

  18. 18

    获取目录中的文件名

  19. 19

    如何遍历目录中某个文件夹中的所有csv文件名,并对这些文件名执行字符串拆分?

  20. 20

    如何将所有文件移动(或复制)到具有相同文件名前缀的目录中?

  21. 21

    如何将所有文件移动(或复制)到具有相同文件名前缀的目录中?

  22. 22

    获取目录中所有文件的不带扩展名的文件名列表

  23. 23

    在Linux或Windows中更改目录中的所有文件名和扩展名

  24. 24

    如何在终端中列出所有文件名?

  25. 25

    如何列出系统中的所有文件名

  26. 26

    读入特定目录中的所有文件会在html列表中显示文件名

  27. 27

    从http目录递归获取所有文件名(不包含内容)

  28. 28

    如何交换目录中的文件名?

  29. 29

    如何将所有目录中具有特定文件名的所有文件复制到一个目标位置?

热门标签

归档