Python教程:备份你的文件夹里面的数据

1.完全备份是最基本的备份类型,它涉及复制所有选定的数据到备份位置。无论文件是否自上次备份以来发生了变化,所有文件都会被复制。这种备份方式简单直接,确保了备份存储的数据总是最新的。

完全备份是通过递归复制源文件夹中的所有文件和子文件夹来实现的。我们使用os库来遍历文件夹,并使用shutil库的copy2函数来复制文件。

2.增量备份仅复制自上次备份以来发生变化的文件。这种备份方式比完全备份更高效,因为它只处理新的或修改过的数据。增量备份节省了时间和存储空间,但恢复数据时可能需要更多步骤,因为它需要结合之前的备份。

增量备份通过比较源文件和目标文件夹中相应文件的最后修改时间来实现。如果目标文件夹中不存在文件,或文件自上次备份以来已更改,则该文件将被复制。

3.镜像备份创建数据的精确副本,包括所有文件和文件夹的结构。这种备份方式不仅复制所有数据,还包括目标文件夹中不存在于源文件夹中的任何额外文件的删除。镜像备份提供了一种恢复到特定时间点的完整数据副本的方法。

在我们的软件中,镜像备份首先删除目标文件夹中不在源文件夹中的所有项目,然后复制源文件夹中的所有内容。
在这里插入图片描述

# -*- coding: utf-8 -*-
# @Author : 小红牛
# 微信公众号:WdPython
import tkinter as tk
from tkinter import filedialog, messagebox
import os
import shutil
import filecmpdef choose_source():# 用户选择源文件夹folder_path = filedialog.askdirectory()if folder_path:source_path.set(folder_path)label_source.config(text=folder_path)def choose_destination():# 用户选择目标文件夹folder_path = filedialog.askdirectory()if folder_path:destination_path.set(folder_path)label_destination.config(text=folder_path)def full_backup(source, destination):if not os.path.exists(destination):os.makedirs(destination)for item in os.listdir(source):source_item = os.path.join(source, item)destination_item = os.path.join(destination, item)if os.path.isdir(source_item):if not os.path.exists(destination_item):os.makedirs(destination_item)full_backup(source_item, destination_item)else:shutil.copy2(source_item, destination_item)def incremental_backup(source, destination):if not os.path.exists(destination):os.makedirs(destination)for item in os.listdir(source):source_item = os.path.join(source, item)destination_item = os.path.join(destination, item)if os.path.isdir(source_item):if not os.path.exists(destination_item):os.makedirs(destination_item)incremental_backup(source_item, destination_item)else:if not os.path.exists(destination_item) or not filecmp.cmp(source_item, destination_item, shallow=False):shutil.copy2(source_item, destination_item)def mirror_backup(source, destination):if not os.path.exists(destination):os.makedirs(destination)destination_items = set(os.listdir(destination))source_items = set(os.listdir(source))for item in destination_items - source_items:destination_item = os.path.join(destination, item)if os.path.isdir(destination_item):shutil.rmtree(destination_item)else:os.remove(destination_item)for item in source_items:source_item = os.path.join(source, item)destination_item = os.path.join(destination, item)if os.path.isdir(source_item):if not os.path.exists(destination_item):os.makedirs(destination_item)mirror_backup(source_item, destination_item)else:shutil.copy2(source_item, destination_item)def backup_files():source = source_path.get()destination = destination_path.get()if not source or not destination:messagebox.showerror("错误", "请选择有效的源和目标文件夹")returntry:if backup_type.get() == "完全备份":full_backup(source, destination)elif backup_type.get() == "增量备份":incremental_backup(source, destination)elif backup_type.get() == "镜像备份":mirror_backup(source, destination)messagebox.showinfo("成功", "备份完成")except Exception as e:messagebox.showerror("错误", str(e))# 设置主窗口
root = tk.Tk()
root.title('文件夹备份软件')
root.geometry('400x240')  # 设置窗口大小source_path = tk.StringVar()
destination_path = tk.StringVar()
backup_type = tk.StringVar(value="完全备份")# 创建界面元素
tk.Button(root, text="选择源文件夹", command=choose_source).pack()
label_source = tk.Label(root, text="", wraplength=300)
label_source.pack()tk.Button(root, text="选择目标文件夹", command=choose_destination).pack()
label_destination = tk.Label(root, text="", wraplength=300)
label_destination.pack()tk.Radiobutton(root, text="完全备份", variable=backup_type, value="完全备份").pack()
tk.Radiobutton(root, text="增量备份", variable=backup_type, value="增量备份").pack()
tk.Radiobutton(root, text="镜像备份", variable=backup_type, value="镜像备份").pack()tk.Button(root, text="开始备份", command=backup_files).pack()
root.mainloop()

完毕!!感谢您的收看

----------★★历史博文集合★★----------
我的零基础Python教程,Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623093.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试算法-175-将有序数组转换为二叉搜索树

题目 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视…

链表里面头节点存在的目的

头节点存在的目的: 在单链表的使用中,头结点(Header Node)是一个常用的概念,特别是在进行链表操作时。头结点不是数据域中实际存储的数据节点,而是作为链表操作的辅助节点,它包含对第一个实际数…

面试经典150题——二叉树的最大深度

1. 题目描述 ​ 2. 题目分析与解析 这个题目有过一定基础的都应该知道,采用递归解决问题,因为要求一个二叉树的深度(也就是高度),其实上就是根节点的左子树和右子树中高度最高的那个。因此这个问题就可以拆解为&…

【电控笔记6.1】稳定度判断

简要概括 现控:远离虚轴,稳定度越高 自控:相位裕度PM 增益裕度GM 开环传函 不稳定条件判断

微信小程序生成链接或二维码的对比

二维码 1.小程序样式码 获取参数直接options.xxx(参数名) 方法:微信公众平台 》工具》生成小程序二维码; 样式图:就一看就是小程序的二维码; 2.正方形二维码/链接 方法:微信公众平台》开…

[linux]进程控制——进程终止

一、main函数的返回值 我们在编写C语言的程序时,通常会这样写: int main() {return 0; } 那么我们为什么要返回(return)0 呢? 其实,main函数也是一个函数,它也会被调用,所以谁调…

面向对象设计模式之概念

一、面向对象设计模式 按目的分为创建型(creational)、结构型(structural)和行为型(behavioural);按范围分为类模式和对象模式。 二、设计原则 两大基础设计原则 程序设计的原则:模…

stm32实现hid鼠标

启动CubelMX 选择芯片(直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程(后记:此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文,以及…

linux网络服务学习(6):多路径multipath解决iscsi多网卡识别错误问题

1.什么是多路径 1.1路径 物理层面一条数据的访问通道 访问方式: (1)以太网卡双绞网线以太网交换机 (2)HBA光纤卡光纤线光纤交换机 访问过程: (1)冗余链路failover&#xff1a…

刷题DAY55 | LeetCode 392-判断子序列 115-不同的子序列

392 判断子序列(easy) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ac…

2024蓝桥杯——宝石问题

先展示题目 声明 以下代码仅是我的个人看法,在自己考试过程中的优化版,本人考试就踩了很多坑,我会—一列举出来。代码可能很多,但是总体时间复杂度不高只有0(N) 函数里面的动态数组我没有写开辟判断和free,这里我忽略…

janus部署

配置和运行janus 1. 配置nginx 安装nginx,主要用来提供web访问。 生成证书 mkdir -p ~/cert cd ~/cert # CA私钥 openssl genrsa -out key.pem 2048 # 自签名证书 openssl req -new -x509 -key key.pem -out cert.pem -days 1095安装nginx #下载nginx 1.15.8版…