2014-10-20 39 views
1

我用下面的超超超级简单的代码来列出一个猪病的所有文件(Windows 8.1,Visual Studio速成2013,C++)的一个简单的例子问题:C++ - 经与用FindFirstFile

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/stat.h> 

#include <limits> 
#include <cstdio> 
#include <iostream> 
#include <fstream> 
#include <bitset> 

#include <windows.h> 
#include <tchar.h> 
#include <stdio.h> 


using namespace std; 


void get_file_list(string DATA_DIR) 
{ 
    HANDLE hFind; 
    WIN32_FIND_DATA data; 

    hFind = FindFirstFile(LPCWSTR(DATA_DIR.c_str()), &data); 

    if (hFind != INVALID_HANDLE_VALUE) { 
     do { 
      printf("%s\n", data.cFileName); 
     } while (FindNextFile(hFind, &data)); 
     FindClose(hFind); 
    } 
} 

int main(int argc, char** argv) 
{ 

    string DATA_DIR = "D:\\drobpox\\Dropbox\\BinaryDescriptors\\LFW\\DATA\\*.*"; 
    //string DATA_DIR = "c:\\Users\\GilLevi\\Downloads\\GraphsSURF\\GraphsSURF\\bark\\*.jpg"; 
    string OUT_DIR = "D:\\drobpox\\Dropbox\\BinaryDescriptors\\LFW\\LATCH_TXT_FILES\\LATCH8"; 


    get_file_list(DATA_DIR); 

} 

但是,我“hFind”总是等于“INVALID_HANDLE_VALUE”。我仔细检查了路径并尝试了各种不同的路径。

可能的原因是我正在运行64位应用程序并使用WIN32_FIND_DATA?

由于提前, 吉尔

+0

那么当FindFirstFile失败时,GetLastError会返回什么? http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx – PaulMcKenzie 2014-10-20 21:56:14

+5

你不能简化类型转换为LPCWSTR的字符串 – wimh 2014-10-20 21:56:52

回答

2

字符串转换为WideString的需要你分配内存和使用字符串转换函数。 如果您不想更改该功能,最简单的解决方案可能是使用非Unicode版本的FindFirstFile,通过将A添加到函数名和结构中;

WIN32_FIND_DATAA data; 

hFind = FindFirstFileA(DATA_DIR.c_str(), &data); 
+1

感谢您的帮助! – GilLevi 2014-10-25 16:04:49

3

由于您使用LPCWSTR,你应该使用std::wstring,在你的程序不std::string

另外,当投射到LPCWSTR时,没有转换魔法。这只是一个愚蠢的“C”剧组,除了关闭编译器之外基本上什么也不做。

+0

感谢您的帮助! – GilLevi 2014-10-25 16:04:29