GetLongPathName API Function Emulation

Environment: Windows 95/NT

The GetLongPathName API call is only available on Windows 98/ME and Windows 2000/XP. It is not available on Windows 95 & NT. This code example emulates the function for use on 95 & NT and will work on the other systems as well.

This example uses MFC and CString, but could be easily adapted to use null terminated character strings as well. The algorithm recursively strips off path components, then reassembles them with their long name equivalents.

DWORD GetLongPathName(CString  strShortPath,
                      CString& strLongPath  )
{
  int iFound = strShortPath.ReverseFind('\\');
  if (iFound > 1)
  {
    // recurse to peel off components
    //
    if (GetLongPathName(strShortPath.Left(iFound),
                        strLongPath) > 0)
    {
      strLongPath += '\\';

      if (strShortPath.Right(1) != "\\")
      {
        WIN32_FIND_DATA findData;

        // append the long component name to the path
        //
        if (INVALID_HANDLE_VALUE != ::FindFirstFile
           (strShortPath, &findData))
        {
          strLongPath += findData.cFileName;
        }
        else
        {
          // if FindFirstFile fails, return the error code
          //
          strLongPath.Empty();
          return 0;
        }
      }
    }
  }
  else
  {
    strLongPath = strShortPath;
  }

  return strLongPath.GetLength();
}