【发布时间】:2016-10-04 01:43:30
【问题描述】:
我指的是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;
}
这是它在 main 中的调用方式:
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) )
我不太明白为什么。我显然在文件夹中有文件。那么为什么我得到一个空列表?非常感谢。
更新:
我在 while(::FindNextFile(hFind, &fd)); 之后添加了 GetLastError()如下:
while(::FindNextFile(hFind, &fd));
lastError = GetLastError();
我得到了ERROR_NO_MORE_FILES' (18) 错误。我很困惑,因为看起来我的文件夹中有很多文件?
【问题讨论】:
-
假设
FindFirstFile失败。你怎么知道的?它(以及 Win32 API 中的许多其他 API)根据各自的文档提供额外的错误信息。查找哪个调用失败并获取文档说您可以获得的任何额外错误信息。那么提供帮助就容易多了。 -
@chris 确实我不知道 FindFirsFile 失败的原因。我试图介入,但它似乎只是一个库,并且没有可用的源代码。我猜它返回的只是失败。我认为只要我给它正确的路径,那么它应该可以工作,但似乎没有。所以我现在不知道。
-
使用
GetLastError()找出为什么它失败了。虽然如果它没有返回INVALID_HANDLE_VALUE,那么它听起来并不像它实际上正在失败。 -
@JonathanPotter 查看更新。
标签: c++ string file winapi widechar