我对FindNextFile
有一个相当尴尬的问题。我已经在下面附加了相关的代码块。
该代码可在99%的情况下完美运行。问题是文件夹名称以浮点值开头。我有一个包含"0.0W"
,"1.0W"
,"3.9W"
,"4.1W"
和"7.0W"
的文件夹。这些是驱动器上文件夹的名称。当我尝试从返回的WIN32_FIND_DATA
结构中获取字符串时。我抓到参数lcFindData.cFileName
,它是一个宽字符串,内容不正确。
即"0.0W"
返回为"0W"
"1.0W"
返回为"1W"
"3.9W"
返回为"3.9W"
"4.1W"
返回为"4.1W"
"7.0W"
返回为"7.0W"
据我所知,它是将浮点数转换为浮点数,然后将其转换回字符串,从而使它们不准确。除了7.0W
似乎很高兴...
void nsDialogFunctions::cFileList::ListFolders(string lsPath,uint32 liMax)
{
//Empty List
SetItems(0);
lsPath+="/*";
HANDLE hFind = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA lcFindData;
//Find First Folder (".")
hFind = FindFirstFile(nsConversionFunctions::ConvertToWString(lsPath).c_str(),&lcFindData);
DWORD dwError=0;
if (INVALID_HANDLE_VALUE == hFind)
{
return;
}
// Fins Second Folder ("..")
FindNextFile(hFind, &lcFindData);
//Find first valid folder
FindNextFile(hFind, &lcFindData);
// List all the files in the directory with some info about them.
do
{
if ((lcFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
string *lcTemp=new string;
//lcFindData.cFileName is sometimes wrong here.
//It is wrong before entering ConvertWString
lcTemp[0]=nsConversionFunctions::ConvertWString(lcFindData.cFileName);
Add(lcTemp);
}
}
while (FindNextFile(hFind, &lcFindData) != 0 && (!liMax || Items()<liMax));
FindClose(hFind);
return;
};
我对
hFind
做错了吗?我可以更改设置以删除此行为吗?
是否有另一个访问点来获取返回的字符串?
最佳答案
FindFirstFile
,FindNextFile
返回文件系统对象的正确名称。然后,您在ConvertWString
中的代码会将这些名称修改为您看到的值。
我不是您决定使用8位文本的忠实拥护者,除非该文本当然是UTF-8编码的。如果您的文本是ANSI编码的,那么使用广泛的API毫无用处。最好调用FindFirstFileA
,FindNextFileA
等,让系统执行文本转换。可以肯定的是,它将正确!