hur*_*n77 5 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();
}
}
Run Code Online (Sandbox Code Playgroud)
一旦我用我真正的主目录路径替换"〜",它就可以工作.有一个简单的解决方法 - 一些设置启用?或者我是否必须采用"丑陋"的方式并向QDir询问当前用户的主目录,并将其手动添加到每个路径?
附录:很明显,shell通常执行代字号扩展,因此程序永远不会看到.在unix shell中它仍然非常方便,我希望文件访问的Qt实现包含该扩展.
为什么不创建一个辅助函数,如(未经测试):
QString morphFile (QString s) {
if (s.startsWith ("~/"))
s.replace (0, 1, QDir::homePath());
return s;
}
:
QFile f(morphFile ("~/.vimrc"));
Run Code Online (Sandbox Code Playgroud)
一个更完整的解决方案可能是(再次未经测试,因为我本地没有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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3246 次 |
| 最近记录: |