Почему не может QFile, считанный из “~” каталога?

Я попробовал следующий короткий пример для обнаружения об ошибке в большей программе, я продолжаю работать. Похоже, что QFile не поддерживает Unix (или оболочка) нотация для корневого каталога:

#include <QFile>
#include <QDebug>

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

Как только я заменяю "~" своим реальным путем корневого каталога, он работает. Существует ли легкое обходное решение - некоторые устанавливающие для включения? Или я должен пойти "ужасным" путем и попросить у QDir корневого каталога текущего пользователя и предварительно ожидать это вручную к каждому пути?

Приложение: ясно, что обычно оболочка выполняет расширение тильды, таким образом, программы никогда не видели бы это. Тем не менее столь удобно в оболочках Unix, что я надеялся, что спокойной реализации для доступа к файлу будут включать то расширение.

5
задан hurikhan77 12 May 2010 в 07:05
поделиться

4 ответа

Почему бы просто не создать вспомогательную функцию, что-то вроде (непроверено):

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;
}
9
ответ дан 18 December 2019 в 13:11
поделиться

Пожалуйста, отправьте предложение в багтрекер Qt.

https://bugreports.qt.io/

2
ответ дан 18 December 2019 в 13:11
поделиться

Посмотрите на функцию библиотеки Си glob, которая выполняет расширение тильды (и, возможно, расширение подстановочного знака и различные другие функции).

0
ответ дан 18 December 2019 в 13:11
поделиться

Это не имеет ничего общего с отказом от поддержки UNIX; расширение тильд в домашнем каталоге пользователя - это замена, выполняемая оболочкой, так что да, вам придется заменить их вручную.

3
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: