String Path::GetTruePath(RCString p) { #if UCFG_USE_POSIX char buf[PATH_MAX]; for (const char *psz = p;; psz = buf) { int len = ::readlink(psz, buf, sizeof(buf)-1); if (len == -1) { if (errno == EINVAL) return psz; CCheck(-1); } buf[len] = 0; } #elif UCFG_WIN32_FULL TCHAR buf[_MAX_PATH]; DWORD len = ::GetLongPathName(p, buf, _countof(buf)-1); Win32Check(len != 0); buf[len] = 0; typedef DWORD (WINAPI *PFN_GetFinalPathNameByHandle)(HANDLE hFile, LPTSTR lpszFilePath, DWORD cchFilePath, DWORD dwFlags); DlProcWrap<PFN_GetFinalPathNameByHandle> pfn("KERNEL32.DLL", EXT_WINAPI_WA_NAME(GetFinalPathNameByHandle)); if (!pfn) return buf; TCHAR buf2[_MAX_PATH]; File file; file.Attach(::CreateFile(buf, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)); len = pfn(Handle(file), buf2, _countof(buf2)-1, 0); Win32Check(len != 0); buf2[len] = 0; #if UCFG_USE_REGEX wcmatch m; if (regex_search(buf2, m, s_reDosName)) return m[1]; #else String sbuf(buf2); //!!! incoplete check, better to use Regex int idx = sbuf.Find(':'); if (idx != -1) return sbuf.Mid(idx-1); #endif return buf2; #else return p; #endif }