C ++ - FindFirstFile的简单示例存在问题

时间:2014-10-20 21:52:52

标签: c++

我使用以下超超级简单代码列出目录中的所有文件(Windows 8.1,Visual Studio Express 2013,C ++):

#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);

}

然而,我&#34; hFind&#34;总是等于&#34; INVALID_HANDLE_VALUE&#34;。我仔细检查了路径并尝试了各种不同的路径。

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

提前致谢, 吉尔

2 个答案:

答案 0 :(得分:4)

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

WIN32_FIND_DATAA data;

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

答案 1 :(得分:3)

由于您正在使用LPCWSTR,因此您应该在程序中使用std::wstring,而不是std::string

此外,当您转换为LPCWSTR时,没有转换魔法。这只是一个愚蠢的C&#39;除了关闭编译器之外基本上什么也没做。