C++-FindFirstFile的一个简单示例出现问题

C++ - Having problems with a simple example of FindFirstFile

本文关键字:问题 简单 一个 C++-FindFirstFile      更新时间:2023-10-16

我使用以下超超级简单代码列出目录中的所有文件(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("%sn", 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);
}

但是,I"hFind"始终等于"INVALID_HANDLE_VALUE"。我仔细检查了一下路径,并尝试了各种不同的路径。

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

提前感谢,Gil

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

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

此外,当你施放LPCWSTR时,没有转换魔法。它只是一个愚蠢的"C"转换,除了关闭编译器之外,基本上什么都不做。