2014-04-17 27 views
0

我有一個相當尷尬的問題FindNextFile。我附上了下面的相關代碼塊。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

有沒有可以改變的設置來消除這種行爲?

是否有另一個獲取返回字符串的接入點?

+0

1. ConvertWString是做什麼用的? 2.你爲什麼要這樣做'lcTemp [0] = nsConversionFunctions :: ConvertWString(lcFindData.cFileName);'? –

+0

ConvertWString將寬字符字符串或wchar *轉換爲char字符串。由於使用了各種其他庫和功能,我們使用std :: string 作爲我們的默認文本容器 – Thormidable

+0

我相信問題在'nsConversionFunctions :: ConvertWString'中。 FindNextFile不會自行進行任何轉換,它會以「原樣」的形式返回文件名。如果你可以提供[SSCCE](http://www.sscce.org/) – Ryzhehvost

回答

1

FindFirstFile,FindNextFile返回文件系統對象的正確名稱。 ConvertWString中的代碼會將這些名稱修改爲您所看到的值。

我不是你的決定使用8位文本的一個非常大的粉絲,當然,除非文本是UTF-8編碼。如果你的文本是ANSI編碼的,那麼使用廣泛的API沒有任何好處。你最好叫FindFirstFileA,FindNextFileA等,讓系統執行文本轉換。當然,它會得到它的權利!

相關問題