为什么QFile不能从“〜”目录中读取?

时间:2010-05-12 06:40:37

标签: c++ qt qt4 tilde-expansion qfile

我尝试了以下简短示例,以了解我正在开发的更大程序中的错误。看起来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 个答案:

答案 0 :(得分:9)

为什么不创建一个辅助函数,比如(未经测试):

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

更完整的解决方案可能是(再次未经测试,因为我本地没有Qt,但有能力的编码人员应该能够实现这一目标):

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

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

    // Special case for current user.

    if (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, "");
    int len = name.indexOf ('/');
    if (len == -1)
        len = name.length()
    else
        len--;
    name = name.left (idx);

    // Find that user in the passwd file, replace with home directory
    //   if found, then return it.

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

    return fspec;
}

答案 1 :(得分:3)

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

答案 2 :(得分:2)

请向Qt bugtracker提交建议。

https://bugreports.qt.io/

答案 3 :(得分:0)

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