6

我尝试了以下简短示例来找出我正在处理的更大程序中的错误。看起来 QFile 不支持主目录的 unix(或 shell 的)表示法:

#include <QFile>
#include <QDebug>

int main()
{
        QFile f("~/.vimrc");
        if (f.open(QIODevice::ReadOnly))
        {
                qDebug() << f.readAll();
                f.close();
        }
        else
        {
                qDebug() << f.error();
        }
}

只要我用我的真实主目录路径替换“~”,它就可以工作。是否有一个简单的解决方法 - 启用一些设置?还是我必须采用“丑陋”的方式向 QDir 询问当前用户的主目录并手动将其添加到每个路径?

附录:很明显,shell 通常会执行波浪号扩展,因此程序永远不会看到。在 unix shell 中它仍然非常方便,我希望用于文件访问的 Qt 实现将包含该扩展。

4

4 回答 4

11

您可以创建一个辅助函数来为您执行此操作,例如:

QString morphFile(QString s) {
    if ((s == "~") || (s.startsWith("~/"))) {
        s.replace (0, 1, QDir::homePath());
    }
    return s;
}
:
QFile vimRc(morphFile("~/.vimrc"));
QFile homeDir(morphFile("~"));

一个更完整的解决方案,也允许其他用户的主目录,可能是:

QString morphFile(QString fspec) {
    // Leave strings alone unless starting with tilde.

    if (! fspec.startsWith("~")) return fspec;

    // Special case for current user.

    if ((fspec == "~") || (fspec.startsWith("~/"))) {
        fspec.replace(0, 1, QDir::homePath());
        return fspec;
    }

    // General case for any user. Get user name and length of it.

    QString name (fspec);
    name.replace(0, 1, "");           // Remove leading '~'.
    int len = name.indexOf('/');      // Get name (up to first '/').
    len = (len == -1)
        ? name.length()
        : len - 1;
    name = name.left(idx);

    // Find that user in the password file, replace with home
    // directory if found, then return it. You can also add a
    // Windows-specific variant if needed.

    struct passwd *pwent = getpwnam(name.toAscii().constData());
    if (pwent != NULL)
        fspec.replace(0, len+1, pwent->pw_dir);

    return fspec;
}

只需记住一件事,当前的解决方案不能移植到 Windows(根据代码中的注释)。我怀疑这对于直接的问题是可以的,因为这.vimrc表明这不是您正在运行的平台(它_vimrc在 Windows 上)。

为该平台定制解决方案是可能的,并且确实表明辅助功能解决方案非常适合,因为您只需更改一段代码即可添加它。

于 2010-05-12T07:03:13.297 回答
3

与不支持UNIX无关;波浪线到用户主目录的扩展是由 shell 执行的替换,所以是的,您必须手动替换它们。

于 2010-05-12T06:42:54.643 回答
2

请向 Qt bugtracker 提交建议。

https://bugreports.qt.io/

于 2010-05-12T07:55:05.263 回答
0

看一下 C 库函数glob,它会进行波浪号扩展(可能还有通配符扩展和其他各种函数)。

于 2010-05-12T07:01:32.877 回答