从QTreeView获取路径压缩文件时遭遇PermissionError权限拒绝问题
解决QTreeView路径获取与压缩PermissionError问题
我帮你分析了代码里的几个关键问题,这几个点是导致你遇到PermissionError以及潜在路径异常的核心原因:
1. 错误的路径获取逻辑
你在on_clicked方法里用self.fileSystemModel.fileInfo(index)获取路径,但self.fileSystemModel只是Duplicate Tab对应的模型,其他Tab(Temp、Unused)的模型是局部变量。当点击这些Tab的TreeView时,用不属于当前index的模型去获取文件信息,可能会导致路径判断异常,甚至间接引发权限问题。正确的做法是通过点击事件的index直接获取它所属的模型:
def on_clicked(self, index): # 从当前点击的节点获取对应模型,而非依赖全局的self.fileSystemModel model = index.model() self.path = model.fileInfo(index).absoluteFilePath() print(self.path)
2. 压缩目标路径需要管理员权限
你把压缩包写到C:\\Windows\\DC\\zipfile.zip,这是系统级目录,普通用户没有写入权限。而删除操作是删除用户桌面的文件(属于你的用户私有目录,天然有权限),所以删除正常但压缩失败。建议改成用户有权限的目录,比如桌面或文档目录:
# 示例:用用户桌面的DC文件夹存储压缩包 zip_save_path = os.path.expanduser("~\\Desktop\\DC\\zipfile.zip") # 确保目录存在,不存在则自动创建 os.makedirs(os.path.dirname(zip_save_path), exist_ok=True)
3. 重复绑定槽函数的隐患
你把按钮的clicked.connect放在on_clicked方法里,每次点击TreeView都会重复绑定槽函数,导致点击一次按钮会触发多次操作(比如多次删除/压缩)。应该把绑定逻辑移到创建按钮的代码块中,比如在Temp、Duplicate、Unused方法里创建按钮后立即绑定:
以Temp方法为例:
def Temp(self): treeView = QTreeView() fileSystemModel = QFileSystemModel(treeView) fileSystemModel.setReadOnly(False) root = fileSystemModel.setRootPath(r'C:\Users\Black Laptop\Desktop\Py1') treeView.setModel(fileSystemModel) treeView.setRootIndex(root) treeView.setSortingEnabled(True) treeView.clicked.connect(self.on_clicked) clearAll_button = QPushButton("Clear all Files") clearAll_button.setFixedSize(90, 30) self.temp_delete_button = QPushButton('Delete') self.temp_delete_button.setFixedSize(90, 30) self.temp_delete_button.clicked.connect(self.delete_file) # 移到此处绑定 self.temp_zip_button = QPushButton('Zip file') self.temp_zip_button.setFixedSize(90, 30) self.temp_zip_button.clicked.connect(self.zip_file) # 移到此处绑定 Layout = QHBoxLayout(self) Layout.addWidget(clearAll_button) Layout.addWidget(self.temp_delete_button) Layout.addWidget(self.temp_zip_button) Layout.addWidget(treeView) self.Temp_Tab.setLayout(Layout)
修改后的核心代码片段
修正后的zip_file方法
def zip_file(self): # 使用用户有权限的目录存储压缩包 zip_save_path = os.path.expanduser("~\\Desktop\\DC\\zipfile.zip") os.makedirs(os.path.dirname(zip_save_path), exist_ok=True) if os.path.isfile(self.path): # 启用压缩模式,默认是无压缩的存储模式 with ZipFile(zip_save_path, 'w', zipfile.ZIP_DEFLATED) as zip: zip.write(self.path, basename(self.path)) print('file zipped successfully!') else: # 用with语句自动管理文件句柄,无需手动close with zipfile.ZipFile(zip_save_path, "w", zipfile.ZIP_DEFLATED) as zf: for dirname, subdirs, files in os.walk(self.path): zf.write(dirname, basename(dirname)) for filename in files: file_path = os.path.join(dirname, filename) zf.write(file_path, basename(file_path)) print('All files/folders zipped successfully!')
按照这些修改后,你的压缩操作应该就能正常执行了,同时也解决了潜在的路径获取错误和重复触发问题。
内容的提问来源于stack exchange,提问作者X-Black...
相关产品推荐
相关产品推荐

