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()