"""实现思路
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()