gpt4 book ai didi

python - QFileInfo vs QFile 测试文件是否可写

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:44 25 4
gpt4 key购买 nike

我正在使用 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 相同的结果。

我有多个问题:

  • 我不熟悉 Windows,是否缺少某些内容?
  • 使用 Qt,我可以使用 QFileInfoQFile 来测试文件是否可以写入。我应该使用一个而不是另一个吗?
  • 如果这只是 Qt(和 Python??)中的一个错误,我想要一个也可以在 Linux 和 Mac OS 上运行的解决方法。

编辑:

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

最佳答案

对于检查可写性,使用哪个并不重要。

与 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

关于python - QFileInfo vs QFile 测试文件是否可写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20720852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com