QFileInfo vs QFile测试文件是否为writab

2024-10-02 08:26:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是PyQt,在Windows环境下测试我的应用程序时,我注意到了一些奇怪的行为(Linux的一切都如预期的那样工作)。在

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

>>> 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

所以看起来{}在那个测试用例中是错误的。但是,在另一个只读文件上:

^{pr2}$

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

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

>>> 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相同。在

我有多个问题:

  • 我不熟悉窗户,有没有遗漏什么?在
  • 使用Qt,我可以使用QFileInfoQFile来测试文件是否可以写入。我应该用一个代替另一个吗?在
  • 以防这只是Qt(和Python)中的一个bug,我想要一个也可以在Linux和Mac操作系统上工作的解决方案。在

编辑:

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

>>> 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

Tags: 文件pyfalsetrue应用程序accessos错误
1条回答
网友
1楼 · 发布于 2024-10-02 08:26:09

为了检查可写性,使用哪一个并不重要。在

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

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

另一个需要注意的问题是QFileInfo.isWritable特定于当前用户。使用QFileInfo.permission获取有关其他用户类的所有权信息(但请注意warning regarding platform differences)。这类似于使用os.access和{}之间的区别。在

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

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上,我得到的结果如下:

^{pr2}$

相关问题 更多 >

    热门问题