pyqt 上传文件大概文件夹打包压缩文件并添加密码并将密码和目标文件信息保 ...

守听  金牌会员 | 2025-3-18 17:52:58 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 970|帖子 970|积分 2910

一、完备代码实现

[code]import sys
import os
import json
import pyzipper
from datetime import datetime
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,
                             QPushButton, QLineEdit, QLabel, QFileDialog,
                             QMessageBox, QProgressBar)
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QFont, QIcon

class ZipThread(QThread):
    progress = pyqtSignal(int)
    finished = pyqtSignal(str)
    error = pyqtSignal(str)

    def __init__(self, source, password, parent=None):
        super().__init__(parent)
        self.source = source
        self.password = password
        self.zip_path = f"{os.path.splitext(source)}_encrypted.zip"

    def run(self):
        try:
            total_files = self.calculate_total_files()
            processed = 0
            
            with pyzipper.AESZipFile(
                self.zip_path,
                'w',
                compression=pyzipper.ZIP_LZMA,
                encryption=pyzipper.WZ_AES
            ) as zf:
                zf.setpassword(self.password.encode())
               
                if os.path.isdir(self.source):
                    for root, dirs, files in os.walk(self.source):
                        for file in files:
                            full_path = os.path.join(root, file)
                            arcname = os.path.relpath(full_path, start=self.source)
                            zf.write(full_path, arcname)
                            processed += 1
                            self.progress.emit(int((processed/total_files)*100))
                else:
                    zf.write(self.source, os.path.basename(self.source))
                    self.progress.emit(100)
            
            self.save_metadata()
            self.finished.emit(self.zip_path)
            
        except Exception as e:
            self.error.emit(str(e))

    def calculate_total_files(self):
        if os.path.isfile(self.source):
            return 1
        count = 0
        for root, dirs, files in os.walk(self.source):
            count += len(files)
        return count

    def save_metadata(self):
        metadata = {
            "timestamp": datetime.now().isoformat(),
            "source_path": self.source,
            "zip_path": self.zip_path,
            "file_size": os.path.getsize(self.zip_path),
            "algorithm": "AES-256"
        }
        with open(self.zip_path + ".json", 'w') as f:
            json.dump(metadata, f, indent=2)

class SecureZipApp(QWidget):
    def __init__(self):
        super().__init__()
        self.selected_path = ""
        self.initUI()
        self.applyStyles()

    def initUI(self):
        self.setWindowTitle('安全文件压缩器')
        self.setWindowIcon(QIcon('lock_icon.png'))
        self.setFixedSize(500, 400)

        # 界面组件
        self.title_label = QLabel("安全加密压缩工具")
        self.path_label = QLabel("已选路径:无")
        self.progress_bar = QProgressBar()
        self.status_label = QLabel("就绪")
        
        self.pwd_input = QLineEdit()
        self.pwd_input.setPlaceholderText("输入加密密码(至少8位)")
        self.pwd_input.setEchoMode(QLineEdit.Password)
        
        # 按钮组
        btn_layout = QHBoxLayout()
        self.file_btn = QPushButton("
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表