文件拷贝器之多进程

import os
import multiprocessing
import time,random

"""
文件拷贝器
1.取得源文件
2.直接命名目标文件夹,在原文件加[副本]
3.创建目标文件将爱
4.取得要拷贝的文件夹中的所有文件名
5.通过进程池去执行每一个文件拷贝任务
6.准备一个还是你好俗,实现文件拷贝任务
7.关闭进程池
8.执行完进程池中的所有任务
9.显示拷贝进度
"""
def copy_file(source_files_name,dest_file_name,file_name,queue):
    # 1.打开源文件
    # 文件夹/文件
    read_file=open(source_files_name+'/'+file_name,"rb")
    # 2.创建或者打开目标文件
    write_file=open(dest_file_name+"/"+file_name,"wb")

    # 3.循环读写数据
    while True:
        time.sleep(random.random())
        content=read_file.read()
        if content:
            write_file.write(content)
        else:
            break

    # 关闭文件
    read_file.close()
    write_file.close()

    # 文件拷贝完了,将拷贝完的文件名发送到队列中
    queue.put(file_name)

#   显示拷贝进度
def copy_cate(file_names,queue):
    # 1.取得要拷贝文件的总数
    total_nums=len(file_names)

    # 当前拷贝的文件数
    copyed_nums=0
    # 2.不断取得拷贝完的文件名
    while True:
        copy_file_name = queue.get()
        copyed_nums +=1
    # 3.不断显示拷贝进度
        rate=copyed_nums/total_nums*100
        print("\r正拷贝完的文件%s,当前的拷贝进度%0.2f%%"%(copy_file_name,rate),end='')
        # r若文件拷贝完成
        if copyed_nums == total_nums:
            break

def main():
    # 文件路径
    root_path="E:\Python复习"
    # 1.取得源文件夹
    source_files_name = root_path+input("请输入要拷贝的文件夹:")
    # 2.直接命名目标文件夹,在源文件夹夹[副本]
    dest_files_name=source_files_name+'[副本]'
    # 3.创建文件夹
    try:
        os.mkdir(dest_files_name)
    except:
        pass

    # 4.取得要拷贝的文件夹的所有文件名
    file_names=os.listdir(source_files_name)
    # 5.通过进程池去执行每一个文件拷贝任务
    # 创建队列
    queue=multiprocessing.Manager().Queue()
    # 创建进程池
    pool=multiprocessing.Pool()
    # 遍历文件列表
    for file_name in file_names:
        pool.apply_async(func=copy_file,args=(source_files_name,dest_files_name,file_name,queue))

    # 关闭进程池
    pool.close()

    # 阻塞进程
    # pool.join()

    # 显示拷贝进度
    copy_cate(file_names,queue)

if __name__ == '__main__':
    main()

 

posted @ 2018-11-26 17:28  晴空!  阅读(195)  评论(0编辑  收藏  举报