首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QFileInfo vs QFile以测试文件是否可写

QFileInfo vs QFile以测试文件是否可写
EN

Stack Overflow用户
提问于 2013-12-21 16:03:44
回答 1查看 5.3K关注 0票数 5

我正在使用PyQt,在用Windows测试我的应用程序时,我注意到了奇怪的行为(在Linux中,一切都如预期的那样)。

我有一个可以读写的文件,我想从这个应用程序中测试它:

代码语言:javascript
复制
>>> from PyQt4.QtCore import QFile, QFileInfo

>>> f1 = QFileInfo("C:\Users\Maxime\Desktop\script.py")
>>> f2 = QFile("C:\Users\Maxime\Desktop\script.py")

>>> f1.isWritable()
True
>>> f2.isWritable()
False

所以看起来QFile在这个测试用例上是错的。但是,在另一个只读文件上:

代码语言:javascript
复制
>>> f1 = QFileInfo("C:\Program Files (x86)\MySoftware\stuff\script.py")
>>> f2 = QFile("C:\Program Files (x86)\MySoftware\stuff\script.py")

>>> f1.isWritable()
True
>>> f2.isWritable()
False

现在,这是QFileInfo,这是错误的!

所以我决定也许我应该用os.access代替:

代码语言:javascript
复制
>>> import os

>>> os.access("C:\Users\Maxime\Desktop\script.py")
True
>>> os.access("C:\Program Files (x86)\MySoftware\stuff\script.py")
True

因此,os.access在一种情况下也是错误的,并返回与QFileInfo相同的结果。

我有多个问题:

  • 我对Windows不熟悉,有什么东西我遗漏了吗?
  • 使用Qt,我可以使用QFileInfoQFile来测试是否可以写入文件。我应该用一个而不是另一个吗?
  • 如果这只是Qt (和Python?)中的一个bug,我想要一个也可以在Linux和Mac上工作的解决方案。

编辑:

Frank的一条非常有趣的评论解释说,QFile::isWritable()总是返回False,因为我还没有打开该文件。

代码语言:javascript
复制
>>> f = QFile("C:\Users\Maxime\Desktop\script.py")
>>> f.open(QFile.WriteOnly)
True
>>> f.isWritable()
True

>>> f = QFile("C:\Program Files (x86)\MySoftware\stuff\script.py")
>>> f.open(QFile.WriteOnly)
False
>>> f.isWritable()
False
EN

回答 1

Stack Overflow用户

发布于 2013-12-21 19:35:20

对于检查可写性而言,使用哪一种并不重要。

与QFileInfo的主要区别在于,出于性能原因,它缓存了一些关于目标文件的信息。但是,您可以使用刷新方法重新读取信息,也可以只使用setCaching来完全关闭缓存。

此外,正如问题注释中所指出的,如果文件尚未打开,QFile.isWritable将返回False。这不是窃听器。文档清楚地表明,isWritable检查文件的OpenMode。在打开文件之前,这将是零(QIODevice.NotOpen),如果未指定,则默认为QIODevice.ReadWrite。

唯一需要注意的其他问题是,像QFileInfo.isWritable这样的方法是特定于当前用户的。使用QFileInfo.permission获取有关其他用户类的所有权信息(但请注意关于平台差异的警告)。这类似于使用os.accessos.stat的区别。

最后,下面是一个测试可写性的简单脚本:

代码语言:javascript
复制
import os, stat, sip

sip.setapi('QString', 2)
from PyQt4.QtCore import QTemporaryFile, QFile, QFileInfo

tmp = QTemporaryFile()
tmp.setAutoRemove(False)
tmp.open()
tmp.close()

path = tmp.fileName()

info = QFileInfo(path)
print('File: %s' % info.filePath())
print('')
print('Qt Writable: %s' % info.isWritable())
print('Qt Permission: %s' % bool(info.permissions() & QFile.WriteUser))
print('Py Writable: %s' % os.access(path, os.W_OK))
print('Py Permission: %s' % bool(os.stat(path).st_mode & stat.S_IWUSR))

tmp = QFile(path)
tmp.setPermissions(QFile.ReadUser)
print('')
print('Set Permissions: ReadUser')
print('')

info.refresh()
print('Qt Writable: %s' % info.isWritable())
print('Qt Permission: %s' % bool(info.permissions() & QFile.WriteUser))
print('Py Writable: %s' % os.access(path, os.W_OK))
print('Py Permission: %s' % bool(os.stat(path).st_mode & stat.S_IWUSR))

tmp.setPermissions(QFile.WriteUser)
print('')
print('Removed: %s' % tmp.remove())

对于我来说,在Linux和WinXp上,我得到的结果如下:

代码语言:javascript
复制
File: /tmp/qt_temp.TJ1535

Qt Writable: True
Qt Permission: True
Py Writable: True
Py Permission: True

Set Permissions: ReadUser

Qt Writable: False
Qt Permission: False
Py Writable: False
Py Permission: False

Removed: True
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20720852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档