6

私が取り組んでいるより大きなプログラムのバグについて調べるために、次の短い例を試してみました。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 シェルでは非常に便利なので、ファイル アクセス用の 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これは、実行しているプラ​​ットフォームではないことを示しているため ( _vimrcWindows 上にあります) 、当面の質問には問題ないと思います。

そのプラットフォームに合わせてソリューションを調整することは可能であり、実際にヘルパー関数ソリューションが適切であることを示しています。それを追加するにはコードを1 つ変更するだけでよいからです。

于 2010-05-12T07:03:13.297 に答える
3

UNIX をサポートしていないこととは何の関係もありません。ユーザーのホームディレクトリへのチルダの展開は、シェルによって実行される置換であるため、手動で置き換える必要があります。

于 2010-05-12T06:42:54.643 に答える
2

Qtバグトラッカーに提案を送信してください。

https://bugreports.qt.io/

于 2010-05-12T07:55:05.263 に答える
0

チルダ展開を行うC ライブラリ関数を見てくださいglob(ワイルドカード展開やその他のさまざまな関数も可能です)。

于 2010-05-12T07:01:32.877 に答える