DWORD GetLongPathName (CStdStringW strShortPath, CStdStringW &strLongPath) { int iFound = strShortPath.ReverseFind (L'\\'); if (iFound > 1) { // recurse to peel off components // if (GetLongPathName(strShortPath.Left (iFound), strLongPath) > 0) { strLongPath += L'\\'; if (strShortPath.Right(1) != L"\\") { HANDLE hFind; if (g_bIsNT) { WIN32_FIND_DATAW findData; // append the long component name to the path // if (INVALID_HANDLE_VALUE != (hFind = ::FindFirstFileW (strShortPath, &findData))) { strLongPath += findData.cFileName; ::FindClose (hFind); } else { // if FindFirstFile fails, return the error code // strLongPath.Empty(); return 0; } } else { WIN32_FIND_DATAA findData; // append the long component name to the path // if (INVALID_HANDLE_VALUE != (hFind = ::FindFirstFileA (CStdStringA (strShortPath), &findData))) { strLongPath += findData.cFileName; ::FindClose (hFind); } else { // if FindFirstFile fails, return the error code // strLongPath.Empty(); return 0; } } } } } else { strLongPath = strShortPath; } return strLongPath.GetLength(); }