摘要
在我能的日常开发中,很多的时候需要用到多线进程文件的复制,这样可以缩短拷贝的时间,本博文将利用python的多线程进行文件的拷贝进行演示和分析。
import multiprocessing
import os
import time
def copy_file(queue, file_name, source_folder_name, dest_folder_name):
print('正在复制:%s' % file_name)
if os.path.isdir(source_folder_name + '/' + file_name):
queue.put(file_name)
return
if not os.path.exists(dest_folder_name):
os.mkdir(dest_folder_name)
data_file = open(source_folder_name + '/' + file_name, 'rb')
cp_file = open(dest_folder_name + '/' + file_name, 'wb')
while True:
content = data_file.read(4096)
if len(content) == 0:
break
cp_file.write(content)
data_file.close()
cp_file.close()
print('%s文件复制完成!' % file_name)
queue.put(file_name)
def copy(source_folder_name, dest_folder_name):
if os.path.exists(dest_folder_name):
if os.listdir(dest_folder_name) == None:
print("当前文件夹已经存在,马上将清空……")
os.removedirs(dest_folder_name)
else:
os.mkdir(dest_folder_name)
file_names = os.listdir(source_folder_name)
# 创建一个队里
queue = multiprocessing.Manager().Queue(128)
# 创建进程池
p = multiprocessing.Pool(10)
for file_name in file_names:
print('put file_name %s' % file_name)
p.apply_async(copy_file, args=(queue, file_name, source_folder_name, dest_folder_name))
p.close()
# p.join()
all_file_nums = len(file_names)
while True:
file_name = queue.get()
if file_name in file_names:
file_names.remove(file_name)
copy_rate = (all_file_nums - len(file_names)) * 100 / all_file_nums
print("\r%.2f=========>(%s) (%0.2f/%0.2f)" % (copy_rate, file_name, len(file_names), all_file_nums) + " " * 50,
end="")
print("remaining: %s" % file_names)
if copy_rate >= 100:
break
print('拷贝文件完成!')
def main():
current_time = time.time()
# 需要拷贝的文件所在的路径
source_folder_name = "C:\\Users\\xjl\\Desktop\\课件"
# 目标拷贝的文件路径
dest_folder_name = "C:\\Users\\xjl\\Desktop\\target"
copy(source_folder_name, dest_folder_name)
print(time.time() - current_time)
if __name__ == "__main__":
main()
测试结果