1. 程式人生 > >python資料夾copy器(多程序版)

python資料夾copy器(多程序版)

本節的練習的要求如下:

  • 輸入要拷貝資料夾的檔名稱
  • 讀取該資料夾下的所有檔案
  • 啟動5個程序來拷貝資料夾,將拷貝成功的檔名稱放入佇列中
  • 主程序中顯示檔案拷貝的進度

程式碼如下:

import multiprocessing
import os
import time
import random


def copy_file(q, file_name, source_folder_name, dest_folder_name):
    """拷貝檔案"""
    # print("正在拷貝檔案:%s,%s ==> %s" % (file_name, source_folder_name, dest_folder_name))
    f_read = open(source_folder_name + "/" + file_name, "rb")
    f_write = open(dest_folder_name + "/" + file_name, "wb")

    while True:
        content = f_read.read(1024)
        if content:
            f_write.write(content)
        else:
            break
    f_write.close()
    f_read.close()

    time.sleep(random.random())

    # 放入已經拷貝完成的檔案
    q.put(file_name)


def main():
    # 獲取要複製的資料夾名稱
    source_folder_name = input("請輸入要複製的資料夾名稱:")

    # 目標資料夾
    dest_folder_name = source_folder_name + "[副本]"

    if not os.path.exists(dest_folder_name):
        os.mkdir(dest_folder_name)

    # 獲取資料夾中的所有普通檔名
    file_names = os.listdir(source_folder_name)

    # 建立Queue
    q = multiprocessing.Manager().Queue()

    # 建立pool
    po = multiprocessing.Pool(5)

    for file_name in file_names:
        po.apply_async(copy_file, args=(q, file_name, source_folder_name, dest_folder_name))

    po.close()

    all_file_num = len(file_names)
    copy_ok_num = 0

    while True:

        file_name = q.get()
        copy_ok_num += 1
        print("\r拷貝的進度為:%.2f%%" % (copy_ok_num * 100 / all_file_num), end="")

        if copy_ok_num >= all_file_num:
            break

    print("")


if __name__ == "__main__":
    main()