mirror of
https://github.com/tnodir/fort
synced 2024-11-15 08:25:20 +00:00
UI: FileUtil: Simplify realPath()
This commit is contained in:
parent
ed758b7612
commit
6cbc10900f
@ -264,25 +264,28 @@ inline bool isDevicePath(LPCWSTR path)
|
|||||||
return path[0] == L'\\' && path[1] == L'\\' && path[2] == L'?' && path[3] == L'\\';
|
return path[0] == L'\\' && path[1] == L'\\' && path[2] == L'?' && path[3] == L'\\';
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void realPathByHandle(HANDLE fileHandle, QString &path)
|
inline QString realPathByHandle(HANDLE fileHandle)
|
||||||
{
|
{
|
||||||
DWORD pathLen = GetFinalPathNameByHandleW(fileHandle, nullptr, 0, FILE_NAME_NORMALIZED);
|
DWORD pathLen = GetFinalPathNameByHandleW(fileHandle, nullptr, 0, FILE_NAME_NORMALIZED);
|
||||||
if (pathLen == 0)
|
if (pathLen == 0)
|
||||||
return;
|
return {};
|
||||||
|
|
||||||
|
// pathLen includes the null terminator
|
||||||
QVarLengthArray<BYTE, 4096> pathBuf(pathLen * sizeof(wchar_t));
|
QVarLengthArray<BYTE, 4096> pathBuf(pathLen * sizeof(wchar_t));
|
||||||
LPWSTR pathData = (LPWSTR) pathBuf.data();
|
LPWSTR pathData = (LPWSTR) pathBuf.data();
|
||||||
|
|
||||||
if (!GetFinalPathNameByHandleW(fileHandle, pathData, pathLen, FILE_NAME_NORMALIZED))
|
pathLen = GetFinalPathNameByHandleW(fileHandle, pathData, pathLen, FILE_NAME_NORMALIZED);
|
||||||
return;
|
if (pathLen == 0)
|
||||||
|
return {};
|
||||||
|
|
||||||
if (isDevicePath(pathData)) {
|
// pathLen does not include the null terminator
|
||||||
constexpr int prefixLen = 4;
|
constexpr int prefixLen = 4;
|
||||||
|
if (pathLen > prefixLen && isDevicePath(pathData)) {
|
||||||
pathData += prefixLen;
|
pathData += prefixLen;
|
||||||
pathLen -= prefixLen;
|
pathLen -= prefixLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
path = QString::fromWCharArray(pathData, pathLen - 1);
|
return QString::fromWCharArray(pathData, pathLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString realPath(const QString &path)
|
QString realPath(const QString &path)
|
||||||
@ -290,22 +293,17 @@ QString realPath(const QString &path)
|
|||||||
if (path.isEmpty())
|
if (path.isEmpty())
|
||||||
return path;
|
return path;
|
||||||
|
|
||||||
const QFileInfo fi(path);
|
const HANDLE fileHandle = CreateFileW((LPCWSTR) path.utf16(), GENERIC_READ, FILE_SHARE_READ,
|
||||||
if (!fi.exists() || fi.isSymbolicLink() || fi.isJunction())
|
|
||||||
return path;
|
|
||||||
|
|
||||||
QString resPath = path;
|
|
||||||
|
|
||||||
const HANDLE fileHandle = CreateFileW((LPCWSTR) resPath.utf16(), GENERIC_READ, FILE_SHARE_READ,
|
|
||||||
nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS /* open dir */, nullptr);
|
nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS /* open dir */, nullptr);
|
||||||
|
|
||||||
|
QString resPath;
|
||||||
if (fileHandle != INVALID_HANDLE_VALUE) {
|
if (fileHandle != INVALID_HANDLE_VALUE) {
|
||||||
realPathByHandle(fileHandle, resPath);
|
resPath = realPathByHandle(fileHandle);
|
||||||
|
|
||||||
CloseHandle(fileHandle);
|
CloseHandle(fileHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
return resPath;
|
return resPath.compare(path, Qt::CaseInsensitive) == 0 ? resPath : path;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool removePath(const QString &path)
|
bool removePath(const QString &path)
|
||||||
|
Loading…
Reference in New Issue
Block a user