进程实现文件拷贝

## 一、复制文件到当前目录下
import os, sys
from multiprocessing import Pool
from multiprocessing import Manager

def copy_file(name, path, new_path, q):
fr = open(path + "/" + name)
fw = open(new_path + '/' + name, "w")
content = fr.read()
fw.write(content)
fr.close()
fw.close()
q.put(name)

def run():
path = input("请输入您要拷贝的路径:")
new_path = path + "-copy"
os.mkdir(new_path)
filename = os.listdir(path)
pool = Pool(5)
q = Manager().Queue()
for name in filename:
pool.apply_async(copy_file, args=(name, path, new_path, q))
num = 0
allnum = len(filename)
while num < allnum:
q.get()
num += 1
copyrate = int(num / allnum)
sys.stdout.write("\r 进度为:%.2f%%" % (copyrate * 100))
sys.stdout.flush()

if __name__ == '__main__':
run()


#######################################
### 二、进程实现拷贝
import multiprocessing,os
from multiprocessing import Manager

# 文件拷贝
def file_copy(file_name, file_dir, queue):
# 创建文件对象
fw = open(file_dir + '/' + file_name, 'w')
fr = open(file_name)
while True:
# 读取数据
file_data = fr.read(1024)
if file_data:
# 写入数据
fw.write(file_data)
else:
fr.close()
fw.close()
# 每拷贝完成一个文件就添加一次
queue.put(file_name)
break

if __name__ == '__main__':
# 创建进程池
pool = multiprocessing.Pool(3)
# 输入拷贝的文件路径
file_path = input("请输入文件路径:")
# 获取指定目录下的文件列表
file_list = os.listdir(file_path)
# 请输入要创建的文件夹
file_dir = input("请输入要创建的文件夹路径和名称:")
os.mkdir(file_dir)
# 创建进程间通信
queue = Manager().Queue()
# 循环遍历得到每一个文件
for file in file_list:
# 异步开启进程池
pool.apply_async(file_copy, args=(file, file_dir, queue))
# 用来显示拷贝进度
num = 0
while num < len(file_list):
# 用来记录拷贝完成了多少文件
queue.get()
num += 1
# 计算百分比
result = num / len(file_list)
print('文件拷贝进度:%2.f%%' % (result * 100))
print("文件拷贝完成...")
# 关闭进程池
pool.close()
# 主进程等待子进程
pool.join()


#####################################
### 三、拷贝到任意位置
# 多任务可以说是多线程,多进程,即在同一时间可以完成多个任务。不管是在python开发过程中还是在其它开发过程中,多线程和多进程开发都是不可缺少的,这不仅仅可以大大提高软件的执行效率,更能方便工具资源的管理。就并发和并行来说,并发不属于多线/进程,并行属于多线/进程。本文,通过使用线程池和消息队列实现了多任务复制的功能以及复制完成百分比的输入。一起来看看如何实现的吧。
# 首先:
# 为了创建线程池和消息队列引入multiprocessing模块
# 为了遍历全部文件导入os模快
# import multiprocessing
# import os
# 然后:
# 对将要实现的功能进行分析
# 获取要拷贝的文件夹名字
# 创建一个新的文件夹
# 获取文件夹中所有待复制的文件
# 创建进程池
# 创建队列
# 复制原文件夹中的文件复制到新文件夹中去

# 最后:
# 根据我们前期的分析,逐步实现我们的代码,详细代码如下所示

import os
import multiprocessing


def copy_file(queue, filename, old_folder_name, new_folder_name):
# 以二进制形式打开文件
data = open(old_folder_name + "/" + filename, "rb")
# 读取文件
temp = data.read()
data.close()

# 新建文件,写入源文件内容
new_data = open(new_folder_name + "/" + filename, "wb")
new_data.write(temp)
new_data.close()
# 如果拷贝完一个文件就向队列里写一个消息,表示已经完成
queue.put(filename)


def main():
# 1.获取要拷贝的文件夹的名字
old_folder_name = input("请输入要拷贝的文件夹的名字:")
# 2.创建一个新的文件夹(文件存在就pass,不存在就创建)
try:
new_folder_name = "D:\demo"
os.mkdir(new_folder_name)
except:
pass
# 3.获取文件夹中所有的待copy的文件 os.listdir()
file_names = os.listdir(old_folder_name)
print(file_names)
# 4.创建进程池,多任务执行复制操作
po = multiprocessing.Pool(3)
# 5.创建队列
queue = multiprocessing.Manager().Queue()
# 6.复制原文件夹中的文件到新的文件夹中
for i in file_names:
print("要拷贝的文件:%s" % i)
po.apply_async(copy_file, args=(queue, i, old_folder_name, new_folder_name))
po.close()
# 获取所有文件的个数
all_files = len(file_names)
# 当前已完成文件个数
current_file = 0
while True:
# data = queue.get()
# print("已经完成:%s 文件的拷贝" % data) # 由于后面已经实现了复制完成的百分比,这里注释了
current_file += 1
print("\r拷贝的进度为:%.2f %%" % ((current_file / all_files) * 100), end="")
if current_file >= all_files:
break
print()

if __name__ == '__main__':
main()
posted @ 2019-04-18 11:55  阖彩  阅读(420)  评论(0编辑  收藏  举报