gpt4 book ai didi

c++ - 为什么 QFile 不能从 "~"目录读取?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:58:53 26 4
gpt4 key购买 nike

我尝试了以下简短示例来找出我正在处理的更大程序中的错误。看起来 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 实现能够包含该扩展。

最佳答案

你可以创建一个辅助函数来为你做这件事,比如:

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 表示这不是您正在运行的平台(它是 Windows 上的 _vimrc)。

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

关于c++ - 为什么 QFile 不能从 "~"目录读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2816499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com