Beispiel #1
0
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
}