2013-12-21 108 views
4

我使用PyQt,并且在用Windows测试我的应用程序时发现了奇怪的行为(所有事情都按照预期与Linux一起工作)。QFileInfo与QFile来测试一个文件是否可写

我有我可以读取和写入文件,我想从应用程序进行测试:

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

我有多个问题:

  • 我不熟悉Windows,是有什么我失踪?
  • 使用Qt,我可以使用QFileInfoQFile来测试是否可以写入文件。我应该使用一个而不是另一个吗?
  • 如果这只是Qt(和Python ??)中的一个错误,我想要一个可以在Linux和Mac OS上工作的解决方法。

编辑:弗兰克

一个非常有趣的评论解释说,因为我还没有打开该文件一个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

可能重复Linux与Python](http://stackoverflow.com/questions/1861836/checking-file-permissions-in-linux-with-python) – ismail

+0

请参阅https://bugreports.qt-project.org/browse/QTBUG-30148 –

+0

@ismail你能告诉我为什么你认为它是重复的? –

回答

2

为了检查可写性,使用哪一个应该无关紧要。

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

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

唯一需要注意的其他问题是像QFileInfo.isWritable这样的方法是特定于当前用户的。使用QFileInfo.permission获取有关其他类用户的所有权信息(但请注意warning regarding platform differences)。这与使用os.accessos.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 
+1

看起来像一个很好,彻底的答案! – lpapp

相关问题