文件夹拷贝器

本次的文件夹拷贝器使用的是多进程,并且用到了进程间的通信来进行进度条的显示。而且用到了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()

这个脚本的缺陷在于,对于目录的文件路径名没有处理好,输入复杂
此外对于目录的递归也没有做,只是单纯的拷贝文件

猜你喜欢

转载自blog.csdn.net/qq_32585565/article/details/84135289
今日推荐