python 关于文件夹拷贝器(多进程版)

"""实现思路
1.获取源文件
2.直接命名目标文件夹,在源文件夹加【副本】
3.创建目标文件夹
4.取得目标文件夹中的所有文件名
5.通过进程池处理文件夹拷贝文件
6.准备一个函数进行实现拷贝
7.关闭进程池,执行jion
8.显示拷贝进度
"""
import multiprocessing
import os

import time


def show_rate(file_names, queue):
    """ 显示进度
      1. 要拷贝文件总数
      2. 不断取得已经拷贝的文件数
      3. 不断显示进度
     """
    totle_file = len(file_names)
    current_copyed_nums = 0
    while True:
        copyed_file_name = queue.get()
        current_copyed_nums += 1
        print("当前进度%0.02f%%,当前正在拷贝的文件是%s" % (current_copyed_nums / totle_file * 100, copyed_file_name))
        if current_copyed_nums == totle_file:
            print("完成拷贝")
            break


def copy_file(file_name, source_folder_name, dest_folder_name, queue):
    """拷贝文件
         1. 打开要拷贝的文件
         2. 创建或者打开目标文件
         3. 读源文件内容
         4. 把源文件的内容写入到目标文件中
         5. 关闭源文件
         6. 关闭目标文件
    """
    read_file = open(source_folder_name + "/" + file_name, "rb")
    write_file = open(dest_folder_name + "/" + file_name, "wb")
    while True:
        time.sleep(1)
        content = read_file.read(1024)
        if content:
            write_file.write(content)
        else:
            break
    read_file.close()
    write_file.close()
    # 文件拷贝完毕
    queue.put(file_name)


def main():
    root_path = "/home/python/Desktop/"  # 文件夹根目录
    source_folder_name = root_path + input("请输入要拷贝的文件夹名:")
    dest_folder_name = source_folder_name + "[副本]"
    try:
        os.mkdir(dest_folder_name)
    except:
        pass
    file_names = os.listdir(source_folder_name)  # 取得文件夹中的所有文件名
    pool = multiprocessing.Pool()  #创建进程池
    queue = multiprocessing.Manager().Queue()  #创建进程列队
    for file_name in file_names:  # 遍历
        pool.apply_async(func=copy_file, args=(file_name, source_folder_name, dest_folder_name, queue))
    pool.close()
    # pool.join()  # 当需要显示进度时join要取消
    show_rate(file_names, queue)


if __name__ == '__main__':
    main()

你可能感兴趣的:(python,python)