好贷网好贷款

模拟Windows文件复制功能

发布时间:2016-12-5 4:33:20 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"模拟Windows文件复制功能",主要涉及到模拟Windows文件复制功能方面的内容,对于模拟Windows文件复制功能感兴趣的同学可以参考一下。

public static void main(String[] args) throws IOException { File src = new File("F:\\1 - 副本"); File dst = new File("F:\\1 - 副本"); copyFileUtil.copy(src, dst); }         在网上看到有人实现的文件复制功能,但是仅仅是比较特殊的情况,没有综合起来考虑。所有,自己动手写了个windows文件复制的函数。不足之处,多交流。 package lianxifile; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import javax.swing.JOptionPane; /** * 功能说明:模拟Windows下文件复制的功能 * * 存在的问题:在一个目录下存在多个副本的情况,还不能处理 ,目前只能处理有一个副本的情况 * */ public class CopyFileUtil { // src 要复制的源文件 dst 被复制的文件的存放目录 public static void copy(File src, File dst) throws IOException { if (!src.exists()) { // 如果源文件不存在 throw new FileNotFoundException(); } else if (!dst.exists()) { // 如果目的目录不存在 if (!dst.mkdirs()) { JOptionPane.showMessageDialog(null, "创建目录" + dst + "失败!"); System.exit(0); } // 创建目录成功,开始复制文件 startCopy(src, dst); } else if (dst.exists()) { /* * 如果目标目录已经存在,弹出提示消息, 0代表‘是’ 1代表‘否’ 2代表‘取消’ */ int i = JOptionPane.showConfirmDialog(null, "目的目录已经存在,是否覆盖?"); switch (i) { case 0: // 删除已经存在的目录,重新创建后进行复制 new File(dst.getName()).delete(); if (!dst.mkdir()) { JOptionPane.showMessageDialog(null, "创建目录" + dst + "失败!"); System.exit(0); } // 创建目录成功,开始复制文件 startCopy(src, dst); System.exit(0); break; case 1: /* * 如果选择‘否’,则创建如下形式的副本“xx - 副本”或“xx - 副本(i)” * getParent返回此抽象路径名父目录的路径名字符串 ,getName 返回由此抽象路径名表示的文件或目录的名称 File(String, * String) 根据parent路径字符串和child路径名字符串创建一个新File实例 * * 还应该考虑到副本是否有重复的,应该首先遍历该目录下是否存在"xx - 副本"的文件, * 如果存在该文件,就需要进一步判断是否存在“xx - 副本 (i)”的文件,需要统计该类文件的数量 */ // 获取当前目录的上一级目录 File fuben = new File(dst.getParent()); // 获取fuben目录下的所有文件(文件夹) File[] listFuBen = fuben.listFiles(); // 变量flag用来标记是否存在形如“xx - 副本”的副本文件 boolean flag = false; // 变量count用来统计形如“xx - 副本(i)”的副本文件的数量 int count = 0; String name1 = dst.getName() + " - 副本"; for (File L : listFuBen) { if (L.isDirectory() && (L.getName().equals(name1))) { // 存在形如“xx - 副本”的副本文件 flag = true; break; } } String name2 = dst.getName() + " - 副本 ("; // 如果存在形如“xx - 副本”的副本文件,需要进一步判断是否存在形如“xx - 副本(i)”的副本文件 if (flag == true) { String str = "副本 ("; for (File L : listFuBen) { String fileName = L.getName(); boolean bool = fileName.contains(str); if (L.isDirectory() && (bool == true)) { // 如果L是目录,且存在形如name2的名字 count++; System.out.println("--------" + count + "--------"); } } } File tempFile = null; // 不存在形如“xx - 副本”的副本文件 if (flag == false) { tempFile = new File(dst.getParent(), dst.getName() + " - 副本"); } else { // 存在形如“xx - 副本”的副本文件,需要根据count的大小来确定“xx - 副本(i)”中的i的大小 tempFile = new File(dst.getParent(), dst.getName() + " - 副本" + " (" + (count + 1) + ")"); } // 如果创建目录失败 if (!tempFile.mkdirs()) { JOptionPane.showMessageDialog(null, "创建目录" + tempFile + "失败!"); System.exit(0); } // 创建目录成功,开始复制文件 startCopy(src, tempFile); System.exit(0); break; case 2: // 取消本次复制文件的操作 JOptionPane.showMessageDialog(null, "您取消了本次文件的复制!"); System.exit(0); break; } } } // copy方法调用此方法 private static void startCopy(File src, File dst) { // 如果src是文件,调用copyFile进行复制 if (src.isFile()) { try { copyFile(src, dst); } catch (Exception e) { e.printStackTrace(); } } else { // 如果src是目录,调用copyDirectory进行目录复制并记录当前复制的目录 File temp = copyDirectory(src, dst); // 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件 File[] list = src.listFiles(); if (list.length == 0) { // 如果该目录下没有内容 则不进行任何操作 } else { for (File l : list) { startCopy(l, temp); } } } } // 遇到文件时,调用此方法 private static void copyFile(File src, File dst) throws FileNotFoundException, IOException { File file = new File(dst, src.getName()); copyFileContent(new FileReader(src), new FileWriter(file)); } // 复制文件内容到另一个文件中 private static void copyFileContent(Reader src, Writer dst) throws IOException { // 用缓冲区进行封装,实现高效操作 BufferedReader bRead = new BufferedReader(src); BufferedWriter bWriter = new BufferedWriter(dst); String str = ""; try { while ((str = bRead.readLine()) != "") { bWriter.write(str, 0, str.length()); bWriter.newLine(); // 每写完一行,在行末添加换行符 } bWriter.flush(); } finally { if (bRead != null) { bRead.close(); } if (bWriter != null) { bWriter.close(); } } } // 遇到目录时,调用此方法并把复制的目录返回给调用者,用以进行目录内的复制工作 private static File copyDirectory(File src, File dst) { File directoryFile = new File(dst, src.getName()); directoryFile.mkdir(); return directoryFile; } } 测试代码如下: public static void main(String[] args) throws IOException { File src = new File("F:\\1 - 副本"); File dst = new File("F:\\1 - 副本"); copyFileUtil.copy(src, dst); } 还想打算加上进度条,如果哪位大神会的话,求指教!

上一篇:Linux清空屏幕
下一篇:

相关文章

相关评论