本次的文件夹拷贝器使用的是多进程,并且用到了进程间的通信来进行进度条的显示。而且用到了with的打开文件写法。
import multiprocessing
import os
def file_copy(q,file_name,old_folder,new_folder):
with open(old_folder +"\\" + file_name,'rb') as f:
content = f.read()
# print("------文件%s读取成功----" % file_name)
with open(new_folder + "\\" + file_name +"--tangsai--","wb") as f_new:
f_new.write(content)
# print("------文件%s写入成功----" % file_name)
# q.put(1)
q.put(file_name)
def main():
#创建进程池,然后创建消息队列
po = multiprocessing.Pool(4)
q = multiprocessing.Manager().Queue()
old_folder = input("请输入要复制的目录:")
new_folder = input("请输入要复制到的目录:")
#使用try可以避免当文件夹存在的时候报错,不过当目录存在里面却有文件的时候,其实应该进行改名备份
try:
os.mkdir(new_folder)
print("目录创建完成----")
except:
pass
target_files = os.listdir(old_folder)
#利用循环调用进程池
for file_name in target_files:
po.apply_async(file_copy,args=(q,file_name,old_folder,new_folder))
print("-----开始复制文件:%s " % file_name)
po.close()
# po.join()
#进行显示方面的优化
all_file_number = len(target_files)
copy_ok = 0
while True:
file_name_get = q.get()
# print("已经完成文件的复制:%s" % file_name_get)
copy_ok +=1
print("\r拷贝进度为:%.2f%%" % (copy_ok*100/all_file_number),end="")
if copy_ok >= all_file_number:
break
print("")
if __name__ == "__main__":
main()
这个脚本的缺陷在于,对于目录的文件路径名没有处理好,输入复杂
此外对于目录的递归也没有做,只是单纯的拷贝文件