我有一个简单的 脚本 ,显示在QTreeView中的QListView中选择的目录的内容,我想添加打开文件资源管理器的功能,以让用户编辑目录内的内容。
但是,添加新的文件夹和文件可以,但删除或移动文件夹或文件会提示“文件夹正在使用”错误:
此操作无法完成,因为该文件已在另一个程序中打开
即使使用管理员权限,文件仍然被锁定,直到脚本关闭。
有没有办法让 Windows 在 Python 脚本运行时覆盖它?
import os
import sys
import PyQt5
from PyQt5 import QtWidgets, QtCore, uic, QtGui
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileSystemModel
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtCore import QFileSystemWatcher
class ImageViewer(QMainWindow):
def __init__(self):
super(ImageViewer, self).__init__()
uic.loadUi(("test.ui"),self)
username = "[USERNAME]"
self.folder = f"C:/users/{username}/Documents/Project"
#List
self.listmodel = QStandardItemModel()
self.listView.setModel(self.listmodel)
self.listView.selectionModel().selectionChanged.connect(self.loadTree) #show content of the selected folder
#Refresh list if there are any changes
self.watcher = QFileSystemWatcher([self.folder])
self.watcher.directoryChanged.connect(self.loadList)
self.watcher.fileChanged.connect(self.loadList)
#Tree
self.treeModel = QFileSystemModel()
self.treeModel.setRootPath(None)
self.treeViewDirectory.setModel(None)
#Open Explorer Button
self.pushButton_explorer.clicked.connect(self.explorer)
self.show()
self.loadList()
def loadList(self):
self.listmodel.clear()
for i in os.listdir(self.folder):
item = QtGui.QStandardItem(i)
self.listmodel.appendRow(item)
def loadTree(self):
selected = self.listView.selectedIndexes()[0].data()
path = self.folder + "/" + selected
self.treeViewDirectory.setModel(self.treeModel)
self.treeViewDirectory.setRootIndex(self.treeModel.index(path))
def explorer(self):
os.startfile(self.folder)
def main():
app = QApplication(sys.argv)
window = ImageViewer()
app.exec_()
if __name__ =="__main__":
main()
问题在于 Python 脚本在默认情况下打开目录以进行读取和写入访问。若要允许其他程序修改目录内容,需要以只读模式打开目录。
这对的脚本没有必要,因为
QFileSystemModel
和
QFileSystemWatcher
不需要写入访问权限即可监视和显示目录内容。
可以通过以下方式更改脚本:
- 不要在脚本中保留对目录的打开句柄。 目前,的脚本没有打开任何显式文件句柄,但它可能以某种方式访问目录。
-
使用
os.scandir
代替os.listdir
。os.scandir
返回一个迭代器,该迭代器生成表示目录条目的os.DirEntry
对象,并且比os.listdir
更有效。 -
在调用
explorer
函数后,考虑使用time.sleep
添加一个短暂的延迟。 这可以让文件资源管理器完全初始化目录视图,然后再进行任何更改。
以下是更新后的
loadList
函数:
def loadList(self):
self.listmodel.clear()
for entry in os.scandir(self.folder):
if entry.is_dir():
item = QtGui.QStandardItem(entry.name)
self.listmodel.appendRow(item)
def explorer(self):
os.startfile(self.folder)
time.sleep(0.5) # 添加一个短暂的延迟
通过这些更改,应该能够在 Python 脚本运行时在文件资源管理器中自由地修改目录内容,而不会遇到“文件夹正在使用”警告。
标签:python,windows,qt,pyqt,explorer From: 78785018