【问题标题】:Getting full path from WIN32_FIND_DATA从 WIN32_FIND_DATA 获取完整路径
【发布时间】:2014-12-08 12:09:30
【问题描述】:

我需要有关从 WIN32_FIND_DATA 获取完整路径的帮助 我的代码:

WIN32_FIND_DATA FindData;
HANDLE hFind;

hFind = FindFirstFile(L"../art/*.dds", &FindData );

if( hFind == INVALID_HANDLE_VALUE )
{
    PrintCharS("Error searching directory");
    return;
}

do
{

    char ch[260];
    char DefChar = ' ';
    WideCharToMultiByte(CP_ACP, 0, FindData.cFileName, -1, ch, 260, &DefChar, NULL);

    string ss(ch);

    if (ch != "invalid.dds")
    {

        LoadFile( / Need WCHAR* that points to file \ );

    }

}
while( FindNextFile(hFind, &FindData) > 0 );

我确实花了一整天的时间试图弄清楚这一点。 但我无法获得路径(../art/*.dds)加上文件名 还有如何检查子文件夹?还是已经这样做了?

当前代码:

WIN32_FIND_DATA FindData;
HANDLE hFind;

hFind = FindFirstFile(L"../art/*.dds", &FindData );

if( hFind == INVALID_HANDLE_VALUE )
{
    PrintCharS("Error searching directory");
    return;
}

do
{

    char ch[260];
    char DefChar = ' ';
    WideCharToMultiByte(CP_ACP, 0, FindData.cFileName, -1, ch, 260, &DefChar, NULL);

    string ss(ch);

    // Just incase they're needed
    DWORD  retval=0;
    BOOL   success; 
    TCHAR  buffer[4096]=TEXT(""); 
    TCHAR  buf[4096]=TEXT(""); 
    TCHAR** lppPart={NULL};

    LPSTR buffeer = "";
    LPSTR* lpppPart = NULL;

    retval = GetFullPathNameA(ch, 4096, buffeer, lpppPart);

    if (retval == 0)
    {
        std::exit(1);
    }
    else
    {

        LoadFile( / Expected WCHAR* \ );

    }

}
while( FindNextFile(hFind, &FindData) > 0 );

【问题讨论】:

    标签: c++ performance wchar


    【解决方案1】:

    您知道您扫描的目录以及在该目录中找到的项目。附加它们以获得与原始搜索相同程度的文件名:../art/something.dds。假设当前目录没有改变,如果反馈给任何原始的OpenFile 调用,那应该可以工作。但如果您确实需要一个完全限定的文件名,请使用该部分名称调用 GetFullPathName

    附言

    char ch[260];
    ⋮
    if (ch != "invalid.dds")
    

    不会工作。你在比较地址,所以它会总是测试为假,与ch内容无关。

    【讨论】:

    • 我完全愚蠢并且厌倦了使用它,但真的需要它工作,我需要一个如何做的例子。我已经尝试过 GetFullPathName 函数,但除了路径的第一个字母外,似乎没有找到任何地方。
    • @SpecialLUANewbie 第一个字母:听起来您正在获取 Unicode(UTF-16),但将其视为 ANSI(8 位)所以您会看到,例如{ 64, 0, 65, 0, ...} 而不是 L"AB..." 避免使用宏和 UNICODE #define,并编写 GetFullPathNameW (—*W*) 以清楚并在该设置的情况下进行类型检查不一致。
    • 如果您传入 WideCharToMultiByte 的结果,它将无法与不合格的 GetFullPathName 一起使用,因为我看到您的上下文是使用了 -W 表单。将 ch 传递给 GetFullPathNameA,或将原始传递给 GetFullPathNameW。
    • @SpecialLUANewbie re “完全愚蠢并且厌倦了使用这个,但真的需要它工作”我去过那里。如果在您休息并查看最新版本后它仍然无法正常工作,请发布您当前的代码示例,我会在下次来这里时查看它。 (并将答案标记为正确)
    猜你喜欢
    • 2012-09-03
    • 2011-12-11
    • 1970-01-01
    • 2010-10-14
    • 2018-08-13
    • 2017-03-16
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多