You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:08:33