2013-12-21 109 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

相關問題