模拟Windows文件复制功能

来源:互联网 发布:win7网络打印机离线 编辑:程序博客网 时间:2024/05/17 22:44
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);}


还想打算加上进度条,如果哪位大神会的话,求指教!

0 0
原创粉丝点击