我正在用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] 删除。
我来说两句