我有一个小但很痒的问题。如何在Qt中获得Windows路径的正确大小写?
假设我在c:\documents and settings\wolfgang\documents
中存储了QString str
路径,我想知道正确的情况,C:\Document and Settings\Wolfgang\Documents
。 QDir(str).absolutePath()
不会让我找到正确的案例。
任何建议,因为我不知道我还能尝试什么?
感谢您的时间!
答案 0 :(得分:6)
没有一种简单的方法可以执行此操作,但您可以尝试执行QDir.entryList,然后对结果执行不区分大小写的搜索。这将为您提供正确的文件名。然后,您需要获得该结果的absolutePath
。
这应该为您提供路径/文件名的保留大小。
答案 1 :(得分:0)
我认为OP当前接受的解决方案(在路径的每个目录级别列出所有子项)确实效率低下,快速又肮脏。肯定有更好的办法。由于路径正确的问题仅与Windows有关(其他平台区分大小写,AFAIK),因此我认为使用#ifdef
并调用Windows API并编写如下内容是完全正确的:
#if defined(Q_OS_WIN32)
#include <Windows.h>
// Returns case-correct absolute path. The path must exist.
// If it does not exist, returns empty string.
QString getCaseCorrectPath(QString path)
{
if (path.isEmpty())
return QString();
// clean-up the path
path = QFileInfo(path).canonicalFilePath();
// get individual parts of the path
QStringList parts = path.split('/');
if (parts.isEmpty())
return QString();
// we start with the drive path
QString correctPath = parts.takeFirst().toUpper() + '\\';
// now we incrementally add parts one by one
for (const QString &part : qAsConst(parts))
{
QString tempPath = correctPath + '\\' + part;
WIN32_FIND_DATA data = {};
HANDLE sh = FindFirstFile(LPCWSTR(tempPath.utf16()), &data);
if (sh == INVALID_HANDLE_VALUE)
return QString();
FindClose(sh);
// add the correct name
correctPath += QString::fromWCharArray(data.cFileName);
}
return correctPath;
}
#endif
我尚未测试过,可能存在一些小问题。请让我知道它是否无效。
答案 2 :(得分:-1)
你可以使用QFileInfo
和函数
QString QFileInfo::absoluteFilePath () const
将返回绝对文件路径。
<强> E.g:强>
QFileInfo yourFileInfo(yourPath);
QString correctedCasePath = yourFileInfo.absoluteFilePath ();
另一个优点是yourPath
可以是QFile
或QString
,因此您可以直接使用当前正在使用的句柄。除此之外,还可以通过QFileInfo
获得其他操作,这些操作可以获取有关所引用文件的有用信息。
希望有所帮助......