当下是信息时代,信息在当今社会占据的地位不言而喻,信息安全更是当前人类重视的问题之一。人类考虑从传输和存储两方面保障信息的安全,备份是在存储工作中保障信息安全的有效方式。本案例要求编写程序,实现一个具有备份文件与文件夹功能的备份工具。

实例分析

文件备份工具的操作流程如下:

(1)用户输入备份的目录;

(2)用户输入备份的文件;

(3)备份文件,提示“备份成功”。

在备份文件或目录时,需要判断待备份的文件或目录是否已经存在:若指定备份的目录不存在,则新建一个指定的目录,否则直接在指定的目录下备份文件;若指定的文件不存在,则提示“备份的文件不存在!”,否则直接备份文件。

import os

# 选择备份的对象(目录或者文件)
def gnxz():
    print('============== 请选择备份的对象 ================')
    print('1.备份目录')
    print('2.备份文件')

# 处理备份
def backup_file(src, dist, file_name):
    # 判断dist目录是否存在,如果不存在,创建目录
    if not os.path.exists(dist):
        os.makedirs(dist)
        print("指定的目录不存在,创建完成")
    # 判断文件是否为我们要备份
    # 得到的是文件名 拼接文件的完整路径
    full_src_path = os.path.join(src, file_name)
    full_dist_path = os.path.join(dist, file_name)
    # 首先判断是否为文件夹,然后借助文件后缀名判断
    if os.path.isfile(full_src_path) and os.path.splitext(full_src_path)[-1].lower() == '.py':
        # print(full_src_path)  # 打印看一下要备份的文件完整目录
        with open(full_dist_path, 'w', encoding='utf-8') as f_dist, \
                open(full_src_path, 'r', encoding='utf-8') as f_src:
            print("开始备份【{0}】".format(file_name))
            # 读取文件内容
            while True:
                rest = f_src.read(100)
                if not rest:
                    break
                # 把读取到的内容写入新的文件中
                f_dist.write(rest)
            f_dist.flush()  # 把剩余没写进去的全部写出去
            print("【{0}】备份完成".format(file_name))

    else:
        print("文件类型不符合要求,跳过..")

# 备份目录
def bf_mulu():
    # src = 'D:\JetBrains\PycharmProjects\实验报告项目十二'
    src = input('请输入您要备份的目录路径:')
    # dist = 'D:\JetBrains\PycharmProjects\实验报告项目十二\备份'
    dist = input('请输入您要将备份放入的目录路径:')
    list1 = os.listdir(src)
    print(f'该目录存在的所有文件:{list1}')
    for i in list1:
        backup_file(src, dist, i)

# 备份文件
def bf_wenjian():
    old_name = input('请输入您要备份的文件:')
    pd = os.path.exists(old_name)  # 判断文件是否存在
    if pd:
        index = old_name.rfind('.')    # . 的下标
        postfix = ''   # 创建字符串储存 包括.的后缀名
        if index > 0:  # 确保其是有效文件
            postfix = old_name[index:]
        # 新文件名: 旧文件名+[备份]+后缀
        new_name = old_name[:index] + '[备份]' + postfix
        print('新文件名:', new_name)
        old_f = open(old_name, 'rb')
        new_f = open(new_name, 'wb')
        # 将数据写入备份文件
        while True:
            con = old_f.read(1024)
            if len(con) == 0:
                print('备份成功!')
                break
            new_f.write(con)
        old_f.close()
        new_f.close()
    else:
        print('备份的文件不存在!')


# 测试
if __name__ == '__main__':
    gnxz()
    a = int(input('请选择备份的对象的序号:'))
    while True:
        if a == 1:
            bf_mulu()
            b = input('是否继续(y/n):')
            if b in 'Y是yes':
                a = int(input('请选择备份的对象的序号:'))
            elif b in 'N否no':
                print('成功退出')
                break
        elif a == 2:
            bf_wenjian()
            b = input('是否继续(y/n):')
            if b in 'Y是yes':
                a = int(input('请选择备份的对象的序号:'))
            elif b in 'N否no':
                print('成功退出')
                break
        else:
            print('对不起,序号错误。请重新输入!')
            a = int(input('请选择备份的对象的序号:'))


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐