FindNextFile返回的文件夹名称存在问题

Issue with Folder names returned by FindNextFile

本文关键字:存在 问题 文件夹 返回 FindNextFile      更新时间:2023-10-16

我对FindNextFile有一个相当棘手的问题。我在下面附上了相关的代码块。

该代码在99%的情况下都能完美工作。问题是当文件夹名称以浮点值开头时。我有一个包含"0.0W""1.0W""3.9W""4.1W""7.0W"的文件夹。这些是驱动器上文件夹的名称。当我试图从返回的CCD_ 7结构中获取字符串时。我获取了参数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等电话,让系统进行文本转换。它肯定会做对的!