`
qingyuan914
  • 浏览: 22089 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

实现文件及目录的拷贝.

阅读更多

今天由于服务器配置管理那边需要一个批处理程序,需要实现的功能是: 能把本地的任意目录的子文件及子文件夹拷贝到指定的目标目录生成的350个文件夹当中去.350个文件夹也是动态生成的,象征性的用user1、user2、user3.......user350.

我是用多线程去实现的,每一个线程完成一份拷贝,那么就的new一个继承了Thread类的数组,数组的大小是350,这个类的run方法去调用要实现拷贝功能类的方法。值得一提的是这个线程类的350个实例都有自己的属性,并且这个类是immutable的。

那么好,我们来看看这个immutable类:

java 代码
  1. import java.io.File;   
  2.   
  3. class SimulateThread extends Thread   
  4. {   
  5.     File root = null;    //要拷贝的文件目录。   
  6.     String folder = null;    //用来做user1、user2、.....的文件夹名称。   
  7.     File toFile=null;    //目标目录。       
  8.     public SimulateThread(ThreadGroup threadgroup, File file,File toFile, String string) { //用构造函数给属性负值   
  9.   
  10.     super(threadgroup, string);   
  11.     ((SimulateThread) this).root = file;   
  12.     ((SimulateThread) this).toFile=toFile;   
  13.     ((SimulateThread) this).folder = string;   
  14.     }   
  15.        
  16.     public synchronized void start() {   
  17.     super.start();   
  18.     }   
  19.        
  20.     public void run() {   
  21.     super.run();   
  22.     try {   
  23.         System.out.println(new StringBuilder().append   
  24.                    (((SimulateThread) this).folder).append   
  25.                    (" Executing...").toString());   
  26.         FileConverter.convertMultiFiles(((SimulateThread) this).root,((SimulateThread) this).toFile,   
  27.                         ((SimulateThread) this).folder,   
  28.                         "EUC-KR""UTF-8");//调用用来生成的文件的方法,并把字符转换的编码格式传入,这里是把EUC-KR转为UTF-8   
  29.         System.out.println(new StringBuilder().append   
  30.                    (((SimulateThread) this).folder).append   
  31.                    (" Done.").toString());   
  32.     } catch (Exception exception) {   
  33.         exception.printStackTrace();   
  34.     }   
  35.     }   
  36. }  
哦,对了,看到StringBuilder这个东东,我的说一下编译及运行环境,必须是jdk5.0以上的版本才行,它是新类。说句题外话,C#里边也有这个东西,不知道是java借鉴C#呢,还是C#借鉴java的呢,对了还有泛型。反正这种情况的出现是一种好兆头。

言归正传,我们来看看FileConverter类,也是程序的主类,程序的入口在它这边

java 代码
  1. import java.io.BufferedReader;   
  2. import java.io.File;   
  3. import java.io.FileInputStream;   
  4. import java.io.FileOutputStream;   
  5. import java.io.IOException;   
  6. import java.io.InputStreamReader;   
  7. import java.io.OutputStreamWriter;   
  8. import java.util.HashMap;   
  9. import java.util.Iterator;   
  10. import java.util.Vector;   
  11.   
  12. public class FileConverter {   
  13.     public static final int BUFFER_SIZE = 1024;   
  14.   
  15.     public static final int EOF = -1;   
  16.   
  17.     public static final int EOL = -1;   
  18.   
  19.     public static final String BACK_SLASH = "\\";  
  20.  
  21.     public static final String REG_BACK_SLASH = "\\\\";  
  22.  
  23.     public static final String NEW_LINE_WINDOWS = "\r\n";  
  24.  
  25.     public static final String NEW_LINE_UNIX = "\n";  
  26.  
  27.     public static final String NEW_LINE_MACOS = "\r";  
  28.  
  29.     public static OutputStreamWriter writer = null;  
  30.  
  31.     public static final int SIMULATE_COUNT = 30;  
  32.  
  33.     public static final String DEFAULT_FROM_ENCODING = "EUC-KR";  
  34.  
  35.     public static final String DEFAULT_TO_ENCODING = "UTF-8";  
  36.  
  37.     public static final String DEFAULT_SOURCE_PATH = "C:\\TEMP";  
  38.  
  39.     private String from = "EUC-KR";  
  40.  
  41.     private String to = "UTF-8";  
  42.  
  43.     private String path = "C:\\TEMP";  
  44.       
  45.     private String topath="C:\\TEMP1";  
  46.  
  47.     public String getTopath() {  
  48.         return topath;  
  49.     }  
  50.  
  51.     public void setTopath(String topath) {  
  52.         this.topath = topath;  
  53.     }  
  54.  
  55.     public String getFrom() {  
  56.         return from;  
  57.     }  
  58.  
  59.     public void setFrom(String string) {  
  60.         from = string;  
  61.     }  
  62.  
  63.     public String getTo() {  
  64.         return to;  
  65.     }  
  66.  
  67.     public void setTo(String string) {  
  68.         to = string;  
  69.     }  
  70.  
  71.     public String getPath() {  
  72.         return path;  
  73.     }  
  74.  
  75.     public void setPath(String string) {  
  76.         path = string;  
  77.     }  
  78.  
  79.     public static void convertFile(String string, String string_0_,  
  80.             String string_1_, String string_2_) throws Exception { //实现单个文件的拷贝  
  81.         InputStreamReader inputstreamreader = new InputStreamReader(  
  82.                 new FileInputStream(string), string_0_);  
  83.         File file = new File(string_1_);  
  84.         if (!file.getParentFile().exists())  
  85.             file.getParentFile().mkdirs();  
  86.         if (!file.exists())  
  87.             file.createNewFile();  
  88.         OutputStreamWriter outputstreamwriter = new OutputStreamWriter(  
  89.                 new FileOutputStream(string_1_), string_2_);  
  90.         char[] cs = new char[1024];  
  91.         int i = -1;  
  92.         while ((i = inputstreamreader.read(cs)) != -1) {  
  93.             outputstreamwriter.write(cs, 0, i);  
  94.             outputstreamwriter.flush();  
  95.         }  
  96.         outputstreamwriter.close();  
  97.     }  
  98.  
  99.     public static void listFiles(File file,  
  100.             OutputStreamWriter outputstreamwriter) throws Exception {  
  101.         if (file.isDirectory() && file.listFiles() != null) {  
  102.             File[] files = file.listFiles();  
  103.             for (int i = 0; i < files.length; i++) {  
  104.                 File file_3_ = new File(files[i].getAbsolutePath());  
  105.                 if (file_3_.isDirectory())  
  106.                     listFiles(file_3_, outputstreamwriter);  
  107.                 else if (file_3_.isFile()) {  
  108.                     outputstreamwriter.write(new StringBuilder().append(  
  109.                             file_3_.getAbsolutePath()).append("\r\n")  
  110.                             .toString());  
  111.                     outputstreamwriter.flush();  
  112.                 } else  
  113.                     System.out.println("What's this?");  
  114.             }  
  115.         }  
  116.     }  
  117.  
  118.     public static Vector listSubFile(File file) throws Exception { //遍历源文件的目录及字文件夹,这种遍历本来可以写一个Composite Pattern来实现,时间比较紧,我就没做  
  119.         Vector vector = new Vector();  
  120.         if (file.isDirectory() && file.listFiles() != null) {  
  121.             File[] files = file.listFiles();  
  122.             for (int i = 0; i < files.length; i++) {  
  123.                 File file_4_ = new File(files[i].getAbsolutePath());  
  124.                 if (file_4_.isDirectory())  
  125.                     vector.addAll(listSubFile(file_4_));  
  126.                 else if (file_4_.isFile())  
  127.                     vector.add(file_4_.getAbsolutePath());  
  128.                 else  
  129.                     System.out.println("What's this?");  
  130.             }  
  131.         }  
  132.         return vector;  
  133.     }  
  134.  
  135.     public static HashMap restoreFiles(File file,File toFile, String string)  
  136.             throws Exception { //把源文件的目录作为key值,把目标目录+useri+以后文件目录或文件的名字做为value放到HashMap中  
  137.         HashMap hashmap = new HashMap();  
  138.         Vector vector = listSubFile(file);  
  139.         Iterator iterator = vector.iterator();  
  140.         while (iterator.hasNext()) {  
  141.             String string_5_ = (String) iterator.next();  
  142.             String string_6_ = doubleBackSlash(file.getAbsolutePath());  
  143.             String string_7_ = doubleBackSlash(toFile.getAbsolutePath());  
  144.             string_7_ = string_7_.concat("\\\\").concat(string);  
  145.             hashmap  
  146.                     .put(string_5_, string_5_  
  147.                             .replaceFirst(string_6_, string_7_));  
  148.         }  
  149.         return hashmap;  
  150.     }  
  151.  
  152.     public static void convertMultiFiles(File file, File toFile,String string,  
  153.             String string_8_, String string_9_) throws Exception { //执行拷贝了  
  154.         HashMap hashmap = restoreFiles(file,toFile,string);  
  155.         Iterator iterator = hashmap.keySet().iterator();  
  156.         while (iterator.hasNext()) {  
  157.             String string_10_ = (String) iterator.next();  
  158.             convertFile(string_10_, string_8_,  
  159.                     (String) hashmap.get(string_10_), string_9_);  
  160.         }  
  161.     }  
  162.  
  163.     public static void setWriter() throws Exception {  
  164.         writer = new OutputStreamWriter(new FileOutputStream(  
  165.                 "D:\\temp.tree.txt"), "GBK");  
  166.     }  
  167.  
  168.     public static void closeWriter() throws Exception {  
  169.         writer.close();  
  170.     }  
  171.  
  172.     public static String doubleBackSlash(String string) {  
  173.         StringBuffer stringbuffer = new StringBuffer(string);  
  174.         int i = -1;  
  175.         while ((i = stringbuffer.indexOf("\\", ++i)) != -1)  
  176.             stringbuffer.insert(++i, "\\");  
  177.         return stringbuffer.toString();  
  178.     }  
  179.  
  180.     public static boolean checkCRLF(String string, String string_11_) {  
  181.         boolean bool = false;  
  182.         if (string != null && string.length() >= string_11_.length()  
  183.                 && string.lastIndexOf(string_11_) != -1)  
  184.             bool = true;  
  185.         return bool;  
  186.     }  
  187.  
  188.     public static String trailingTrim(String string, String string_12_) {  
  189.         if (string != null && string.length() >= string_12_.length())  
  190.             string = string.substring(0, string.indexOf(string_12_));  
  191.         return string;  
  192.     }  
  193.  
  194.     public FileConverter() {  
  195.         path = "C:\\TEMP";  
  196.     }  
  197.  
  198.     public void inputPath() {//获取System.in的输入,去掉回车符,并把要copy的目录与目标目录用空格分开  
  199.         String s = "";  
  200.         InputStreamReader inputstreamreader = new InputStreamReader(System.in);  
  201.         BufferedReader bufferedreader = new BufferedReader(inputstreamreader);  
  202.         System.out.println("Unix: ctrl-d or ctrl-c to exit.\nWindows:Type ctrl-z or ctrl-c to exit.\nPlease " +  
  203. "input source path:"  
  204. );  
  205.         try  
  206.         {  
  207.             int i = bufferedreader.read();  
  208.             do  
  209.             {  
  210.                 s = (new StringBuilder()).append(s).append((char)i).toString();  
  211.                 if(i == 10 && checkCRLF(s, "\r\n"))  
  212.                 {  
  213.                     s = trailingTrim(s, "\r\n");  
  214.                     if(s.length() == 0)  
  215.                     {  
  216.                         System.out.print("The default path: C:\\temp will be used for source path.");  
  217.                     }  
  218.                     break;  
  219.                 }  
  220.                 i = bufferedreader.read();  
  221.             } while(true);  
  222.             System.out.println((new StringBuilder()).append("Read: ").append(s).toString());  
  223.             bufferedreader.close();  
  224.         }  
  225.         catch(IOException ioexception)  
  226.         {  
  227.             ioexception.printStackTrace();  
  228.         }  
  229.         String[] temp=s.split(" ");  
  230.         setPath(temp[0]);//set copy的目录  
  231.         this.setTopath(temp[1]);//set 目标目录  
  232.         File toFile=new File(topath);  
  233.         toFile.mkdir();//生成目标目录。  
  234.     }  
  235.  
  236.     public void start() throws Exception {  
  237.         inputPath();  
  238.         String[] strings = new String[350];  
  239.         for (int i = 0; i < strings.length; i++)  
  240.             strings[i] = new StringBuilder().append("user").append(i + 1)  
  241.                     .toString();  
  242.         File file = new File(path);  
  243.         File toFile=new File(topath);  
  244.         ThreadGroup threadgroup = new ThreadGroup("APP TEST");  
  245.         Thread[] threads = new Thread[350];  
  246.         for (int i = 0; i < threads.length; i++) {//生成350个SimulateThread对象并把在目标目录生成的文件夹的名称也作为参数  
  247.             threads[i] = new SimulateThread(threadgroup, file,toFile, strings[i]);  
  248.             threads[i].start();  
  249.         }  
  250.         for (;;) {  
  251.             int i = threadgroup.activeCount();  
  252.             if (i <= 0)  
  253.                 break;  
  254.             Thread.sleep(500L);  
  255.         }  
  256.         System.out.println("Done.");   
  257.     }   
  258.   
  259.     public static void main(String[] strings) throws Exception {   
  260.         new FileConverter().start();//创建一个FileConverter对象并且调用它的start方法   
  261.     }   
  262.   
  263. }   
好了,破于时间注释也不多写了,以上的代码大多都能看懂,俺也不多说了.
可以把他们的class文件打成jar文件,在 manifest.MF 写上Main-Class: FileConverter再写一个批处理run.bat
java -jar jar包名
噢了。。。。。。。。。。。。。。。。。。
对了还有一个问题就是文件的目录名及文件名不应该出现空格,因为以空格来截取拷贝的目录和目标目录的。
分享到:
评论

相关推荐

    copy_files.zip_线程池实现文件目录的拷贝

    在“copy_files.zip”这个压缩包中,我们看到的是一个使用线程池来实现文件目录拷贝的程序。下面我们将深入探讨线程池的概念、其工作原理,以及如何应用于文件操作,特别是文件目录的拷贝。 1. **线程池概念**: ...

    Qt实现文件拷贝

    在我们的文件拷贝场景中,`QDirIterator`将特别有用,因为它可以迭代指定目录及其子目录中的所有文件和子目录。 在开始复制文件之前,我们需要创建一个`QThread`对象,这是Qt中的多线程基础。通过继承`QThread`,...

    3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件

    - **拷贝文件/目录**:调用`boolean rename(Path src, Path dst)`,实现文件或目录的重命名(相当于拷贝并删除源文件)。 - **获取文件属性**:使用`FileStatus getFileStatus(Path f)`获取文件或目录的元数据信息。...

    用java实现文件拷贝

    Java实现文件拷贝的小程序 本资源是一个使用Java语言实现文件拷贝的小程序,具有很实用的功能。下面是对这个小程序的详细解释和知识点总结: 文件拷贝的基本概念 文件拷贝是将一个文件的内容复制到另一个文件中,...

    Java简易文件管理器

    2.实现文件的拷贝与粘贴功能。3.实现文本类文件(.txt, .java, .ini, .bat, )的预览功能(比如实现对前100行文本在某个小窗口中进行预览)。4.实现文件的重命名功能。5.实现对某个文件夹进行统计功能(如统计文件夹中...

    C#实现异步拷贝多个文件

    这可以通过在`CopyFilesAsync`方法中添加回调函数实现,每当文件拷贝完成时调用这个回调: ```csharp public async Task CopyFilesAsync(string[] fileNames, string destinationDirectory, Action&lt;int&gt; ...

    php的FTP操作类( 拷贝、移动、删除文件 创建目录 ).zip

    拷贝文件在FTP类中可能通过自定义方法实现,如`copy_file()`,它会打开两个FTP流,分别读取源文件并写入目标文件。`delete_file()`方法则用于删除指定的远程文件。 最后,完成所有操作后,使用`close()`方法断开与...

    Linux下C语言实现文件拷贝

    ### Linux下C语言实现文件拷贝 #### 一、引言 在计算机编程领域,特别是在系统级编程中,文件操作是非常基础且重要的功能之一。在Linux环境下,利用C语言进行文件操作具有高度的灵活性和效率。本文将详细介绍如何在...

    python爬虫-10-拷贝、移动文件和目录.ev4.rar

    `os`模块提供了许多与操作系统交互的功能,包括创建、删除、重命名文件或目录,而`shutil`模块则提供了更高级的文件操作,如复制和移动文件及目录。 2. **os模块** - `os.path`: 这个子模块包含了各种路径操作函数...

    Linux线程池目录拷贝

    为了实现文件的拷贝,我们需要打开源文件,读取其内容,然后将内容写入目标文件。同时,需要考虑错误处理,例如文件不存在、权限不足等情况。 并发控制是线程池拷贝目录时的另一个关键点。由于多个线程可能同时尝试...

    vc实现文件夹从一个目录下拷贝到另一个目录

    ### VC实现文件夹从一个目录下拷贝到另一个目录 #### 概述 在软件开发过程中,经常需要处理文件及文件夹的操作,如复制、移动等。本文将详细介绍如何使用Visual C++(简称VC)来实现文件夹从一个目录复制到另一个...

    WPF 拷贝文件到当前目录

    以下是一个示例代码片段,演示如何在WPF应用中实现文件拷贝: ```csharp using System; using System.IO; public void CopyConfigFile() { // 假设配置文件在项目的Resources子目录下,名为config.xml string ...

    关于文件拷贝.docx

    首先,将文件复制到U盘中,然后将U盘插入虚拟机的USB接口,虚拟机会识别并挂载这个U盘,此时在虚拟机内就能访问U盘中的文件,从而实现文件的拷贝。 2. **双向拷贝**: 双向拷贝是指允许主机和虚拟机之间自由地互相...

    mfc文件浏览器实现文件拷贝功能多线程

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 框架来实现一个文件浏览器,并且重点讲解如何在其中实现文件拷贝功能,同时利用多线程技术提高程序性能。MFC 是 Microsoft 提供的一个C++库,它...

    复制文件到指定目录.zip

    在提到的“API接口练习”中,可能涉及到通过网络API来实现文件的远程复制。这通常需要调用HTTP或FTP等协议的客户端库。例如,对于HTTP,可以使用`HttpClient`类来发送POST请求,将文件作为流上传到服务器。在接收端...

    01 批量拷贝指定文件.zip

    1. **正确放置文件**:确保要运行的脚本或程序位于包含待拷贝文件的顶级目录下。这样,工具才能遍历该目录及其子目录。 2. **编辑name.txt**:在name.txt文件中,列出所有要拷贝的文件名,每行一个文件名。文件名应...

    WVCopyFile Delphi文件拷贝组件..rar

    `WVCopyFile`组件就是为了解决这类问题而设计的,它提供了一个便捷的方式来实现文件和文件夹的高效、安全的拷贝。本篇文章将深入探讨`WVCopyFile`组件以及在Delphi中如何使用它。 `WVCopyFile`组件并非Delphi标准库...

    不同linux电脑(集群节点)上文件的拷贝.docx

    在Linux集群中,`scp`命令是进行节点间文件拷贝的标准工具。 1. **从lu@datanode1登录到hadoop@datanode3并拷贝文件**: 在lu@datanode1上,可以使用以下命令将文件从datanode3拷贝到datanode1: ```bash scp ...

    Delphi实现局部图像拷贝.rar

    这个“Delphi实现局部图像拷贝.rar”压缩包可能包含了一个使用Delphi编写的示例项目,用于演示如何从图像中复制一个局部区域到另一个图像或剪贴板上。以下是对这一主题的详细解释: 1. **图像处理基础**:在Delphi...

    Android 手机sdcard目录或文件的拷贝 移动 删除 递归

    一个关于文件操作的静态工具类 实现手机SD卡目录或文件的拷贝 移动 删除 递归 Demo中有详细注释 在进行Demo测试时 建议先把测试的文件备份一下在测试 否则删除就找不回了 具体可见我博客...实现手机SD卡目录或文件的...

Global site tag (gtag.js) - Google Analytics