2014-10-13 5 views
0

мне нужна помощь с получать полный путь от WIN32_FIND_DATA мой код:Получение полного пути от 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); 

ответ

1

Вы знаете каталог, отсканированные и пункт в этом каталоге, который был найден. Добавьте их, чтобы получить имя файла, имеющее такую ​​же степень, что и исходный поиск: ../art/something.dds. Предполагая, что текущий каталог не изменился, он должен работать, если его подавать на любой примитивный вызов OpenFile. Но если вам действительно нужно полное имя файла, вызовите GetFullPathName с этим частичным именем.

P.S.

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

не будет работать. Вы сравниваете адреса, поэтому он будет всегда проверять ложь и не имеет ничего общего с содержанием от ch.

+0

Я совершенно глуп и устал работать с этим, но мне действительно нужно, чтобы он работал, мне нужен пример того, как это сделать. Я пробовал функцию GetFullPathName, но, похоже, не получил меня нигде, кроме самой первой буквы пути. – SpecialLUANewbie

+0

@SpecialLUANewbie очень первое письмо: похоже, что вы получаете Unicode (UTF-16), но рассматриваете его как ANSI (8-разрядный), чтобы вы видели, например. {64, 0, 65, 0, ...} вместо 'L" AB ... "' Избегайте макросов и UNICODE #define и пишите 'GetFullPathNameW' (- * W *), чтобы быть ясным и получить проверку типов в случае, когда эта настройка несовместима. –

+0

Если вы передадите результат WideCharToMultiByte, он не будет работать с неквалифицированным GetFullPathName, так как я вижу, что ваш контекст использует формы -W. Передайте ch в GetFullPathNameA или передайте оригинал в GetFullPathNameW. –