首发于我的个人博客: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的差别,这里不再赘述。