进程实现文件拷贝

## 一、复制文件到当前目录下import os, sysfrom multiprocessing import Poolfrom 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,osfrom 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 osimport 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()

原文地址:https://www.cnblogs.com/shababy/p/10728757.html

时间: 2024-10-17 05:41:24

进程实现文件拷贝的相关文章

linux--多进程进行文件拷贝

学习IO的时候,我们都曾经利用文件IO函数,标准IO函数都实现了对文件的拷贝, 对某一个文件进行拷贝时,我们可以考虑一下几种方式: a.单进程拷贝: 假设某一文件需要拷贝100字节,每一个时间片可以完成拷贝20个字节工作量,则需要被分配5个时间片才可以完成任务,但问题是这些个时间片并不是被连续分配的,我们并不知道 到经过多少时间片才会有下一个能分配给该进程的时间片,为了解决这个问题,我们有了第二种方法. b.多进程拷贝(单核单CPU): 通过切换进程,随着进程数的增加,当前程序获得时间片所需要的

linux下多进程的文件拷贝与进程相关的一些基础知识

之前实现了用文件IO的方式可以实现文件的拷贝,那么对于进程而言,我们是否也可以实现呢? 答案是肯定的. 进程资源: 首先我们先回顾一下,进程的运行需要哪些资源呢?其资源包括CPU资源,内存资源,当然还有时间片资源,我们都知道进程是有 栈, 堆,  只读数据段,  数据段(已初始化的全局变量静态变量),bss段(未初始化的),   代码段还有一组寄存器值. 进程命令: 另外我们也可以通过 ps  -ef |grep 进程名命令来查看进程号(PID)和父进程号(PPID),之后还可以通过 ps au

JAVA程序设计(17)----- 制作文件拷贝软件 进程 输入流输出流 NIO 进度条 底层拷贝 多线程

使用NIO对文件进行底层拷贝(按照字节)多线程技术初级应用 不阻塞程序运行 package com.lovo.homework01; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import

&lt;实训|第十一天&gt;学习一下linux中的进程,文件查找,文件压缩与IO重定向

[[email protected]~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就讲解一下关于运维工程师例行事务的知识!  开班第十一天: [[email protected]~]#今天的课程大纲 查看进程,中断进程,切换进程 内存与swap分区 linux中文件查找的基本方法 linux中是如何解压缩文件的 关于I/O重定向的知识点 远程scp配合管道 详细讲解: [[e

Java IO和Java NIO在文件拷贝上的性能差异分析 (转)

1.       在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取 到用户空间的缓冲区.参看read(byte b[])方法的源码,可知,它会在内部再调用readBytes(b, 0, b.length)方法,而且readBytes(b, 0, b.length)方法是一个native方法(即本地方法),最终通过这个本地方法来发起一次系统调用,即调用系统内核的read()

Java IO和Java NIO在文件拷贝上的性能差异分析

1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区.参看read(byte b[])方法的源码,可知,它会在内部再调用readBytes(b, 0, b.length)方法,而且readBytes(b, 0, b.length)方法是一个native方法(即本地方法),最终通过这个本地方法来发起一次系统调用,即调用系统内核的read()方法,内核从

多进程和多线程文件拷贝

1. 线程与进程的异同点 A.相同点 1):  比如都有自己在系统中唯一标识ID,一组寄存器(pc指针),状态(6种),调度优先级以及所要遵循的调度策略. 2):  每个进程都有一个进程控制块,线程也拥有一个线程控制块(在Linux内核,线程控制块与进程控制块用同一个结         构体描述,即struct  task_struct),这个控制块包含线程的一些属性信息,操作系统使用这些属性信息来描述线             程. 3):  线程和子进程的创建者可以在线程和子进程上实行某些控

大文件拷贝,试试NIO的内存映射

最近项目里有个需求需要实现文件拷贝,在java中文件拷贝流的读写,很容易就想到IO中的InputStream和OutputStream之类的,但是上网查了一下文件拷贝也是有很多种方法的,除了IO,还有NIO.Apache提供的工具类.JDK自带的文件拷贝方法 IO拷贝 public class IOFileCopy { private static final int BUFFER_SIZE = 1024; public static void copyFile(String source, S

文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

 1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; //通过ofstream的方式实现写入文件 open,close void main() { ofstream fout;  //ofstream输出文件 fout.open("E:\\1.txt");//打开文件 fout << "1234abcdef";