Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WIN32_FIND_DATA - Get the absolute path

I'm using something like this:

std::string tempDirectory = "./test/*";

WIN32_FIND_DATA directoryHandle;
memset(&directoryHandle, 0, sizeof(WIN32_FIND_DATA));//perhaps redundant???

std::wstring wideString = std::wstring(tempDirectory.begin(), tempDirectory.end());
LPCWSTR directoryPath = wideString.c_str();

//iterate over all files
HANDLE handle = FindFirstFile(directoryPath, &directoryHandle);
while(INVALID_HANDLE_VALUE != handle)
{
    //skip non-files
    if (!(directoryHandle.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
    {
        //convert from WCHAR to std::string
        size_t size = wcslen(directoryHandle.cFileName);
        char * buffer = new char [2 * size + 2];
        wcstombs(buffer, directoryHandle.cFileName, 2 * size + 2);
        std::string file(buffer);
        delete [] buffer;

        std::cout << file;
    }

    if(FALSE == FindNextFile(handle, &directoryHandle)) break;
}

//close the handle
FindClose(handle);

which prints the names of each file in the relative directory ./test/*.

Is there any way to determine the absolute path of this directory, just like realpath() does on Linux without involving any 3rd party libraries like BOOST? I'd like to print the absolute path to each file.

like image 992
Mihai Todor Avatar asked Sep 11 '12 00:09

Mihai Todor


2 Answers

See the GetFullPathName function.

like image 115
Jonathan Potter Avatar answered Oct 06 '22 04:10

Jonathan Potter


You can try GetFullPathName

Or you can use SetCurrentDirectory and GetCurrentDirectory. You might want to save the current directory before doing this so you can go back to it afterwards.

In both cases, you only need to get the full path of your search directory. API calls are slow. Inside the loop you just combine strings.

like image 30
paddy Avatar answered Oct 06 '22 05:10

paddy