如何获得路径的正确情况?

时间:2010-09-05 03:12:02

标签: c++ qt

我有一个小但很痒的问题。如何在Qt中获得Windows路径的正确大小写?

假设我在c:\documents and settings\wolfgang\documents中存储了QString str路径,我想知道正确的情况,C:\Document and Settings\Wolfgang\DocumentsQDir(str).absolutePath()不会让我找到正确的案例。

任何建议,因为我不知道我还能尝试什么?

感谢您的时间!

3 个答案:

答案 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可以是QFileQString,因此您可以直接使用当前正在使用的句柄。除此之外,还可以通过QFileInfo获得其他操作,这些操作可以获取有关所引用文件的有用信息。

希望有所帮助......