我正在使用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
因此看起来QFile
在该测试用例中是错误的。但是,在另一个只读的文件中:
>>> 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
代替:
>>> 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
相同的结果。
我有多个问题:
QFileInfo
和QFile
来测试是否可以写入文件。我应该使用一个而不是另一个吗?修改
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
答案 0 :(得分:2)
为了检查可写性,使用哪一个并不重要。
与QFileInfo的主要区别在于,出于性能原因,它会缓存一些有关目标文件的信息。但是,您可以使用refresh方法重新读取信息,或者只使用setCaching完全关闭缓存。
此外,如问题评论中所述,如果文件尚未打开,QFile.isWritable将返回False。这不是一个错误。该文档清楚地表明isWritable检查文件的OpenMode。在文件打开之前,它将为零(QIODevice.NotOpen),否则默认为QIODevice.ReadWrite(如果未指定)。
唯一需要注意的其他问题是QFileInfo.isWritable等方法特定于当前用户。使用QFileInfo.permission获取有关其他用户类的所有权信息(但请注意warning regarding platform differences)。这类似于使用os.access
和os.stat
之间的区别。
最后,这是一个测试可写性的简单脚本:
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上,我得到的结果如下:
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