QFileInfo在Windows上获取文件权限错误的解决方法

首发于我的个人博客:xie-kang.com
博客内有更多文章,欢迎大家访问
原文地址

首先可以明确一点,现在用户Windows电脑上的磁盘格式大多数都是NTFS(New Technology File System)。但Qt 在NTFS的磁盘格式上对文件权限的判断并不准确。

按照Qt的文档指导,我们知道可以通过使用qt_ntfs_permission_lookup开启权限查找,使QFileInfo::permissions返回正确值,使用方法:

extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; // cpp文件引入该外部变量

void yourFunc()
{
    qt_ntfs_permission_lookup++;      // 开启权限查找
    QFileInfo fileInfo("file.txt");
    fileInfo.refresh();               // 注意:QFileInfo是会缓存的,我们需要手动刷新一下
    qDebug()<<fileInfo.permissions(); // 这里就能正确获取文件的权限了
    qt_ntfs_permission_lookup--;      // 使用完推荐将这开关关闭,Qt文档说是因为有性能才默认关闭
}

如果不需要明确知道目标文件的读写权限,还可以通过下述方法检测文件是否可写:

  • QFile 在未使用qt_ntfs_permission_lookup开启强检测时,对没有写权限的文件使用open(QFile::WriteOnly)会return false,此时使用QFile::errorString()可以获取错误原因:“拒绝访问。”。

可以注意到,QFile经过open后,isWritable()的返回结果也具有可信度了(QFile::isWritable在未open前总是返回false)。
但QFile的兄弟QSaveFile就不是这样,它就算open失败,QSaveFile::isWritable依然会返回true。不过在开启qt_ntfs_permission_lookup后QSaveFile::isWritable也能按照期望工作。根据它的表现,不看源码也可以猜测,QSaveFile::isWritable里面对目标文件的判断可能也使用了permissions()进行可写性判断。

至于为什么QFile::isWretable与QSaveFile::isWritable的表现不一样,大家可以看下QFile与QSaveFile的差别,这里不再赘述。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值