我对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做错了吗?

我可以更改设置以删除此行为吗?

是否有另一个访问点来获取返回的字符串?

最佳答案

FindFirstFileFindNextFile返回文件系统对象的正确名称。然后,您在ConvertWString中的代码会将这些名称修改为您看到的值。

我不是您决定使用8位文本的忠实拥护者,除非该文本当然是UTF-8编码的。如果您的文本是ANSI编码的,那么使用广泛的API毫无用处。最好调用FindFirstFileAFindNextFileA等,让系统执行文本转换。可以肯定的是,它将正确!

10-07 12:09
查看更多