package com.yingzi.javaCommand;
import java.io.*;
public class CopyFile {
String startFilePath = null;
String desFilePath = null;
public CopyFile() {
}
/**
*
* 如果复制的是个文件夹,那么有个前提,那就是目的文件夹所在位置,不能在源文件夹的子目录中,
* 如:如果源文件夹为D:/yingzi ,那么目的文件夹不能在D:/yingzi文件夹下的某个位置,因为这样
* 会造成无限循环源文件夹下内容一直增加着,而目的文件夹下内容随着源文件夹的增加而增加,
* windows下就不可以复制,不信你试试
*
* @param startFilePath
* = 原始文件路径
* @param desFilePath
* = 目标文件路径
* @return = 返回true,表示复制成功,返回false表示复制失败
*
*/
public boolean copy(String startFilePath, String desFilePath) {
this.startFilePath = startFilePath;
this.desFilePath = desFilePath;
// 判断是否返回成功的变量
boolean copyFinished = false;
File startFile = new File(startFilePath);
File desFile = new File(desFilePath);
// 如果源文件是个文件
if (startFile.isFile()) {
copyFinished = this.copySingleFile(startFile, desFile);
// 如果源文件是个文件夹,就需要递归复制
} else {
//如果目标文件夹是源文件夹的一个子目录的情况,拒绝复制,因为会造成无限循环
if(desFilePath.startsWith(startFilePath)){
System.out.println("error copy");
return false;
}else
copyFinished = this.copyFolder(startFile, desFile);
}
return copyFinished;
}
/**
* 此方法为复制单个文件,如果复制多个文件可以递归调用
*/
private boolean copySingleFile(File startSingleFile, File desSingleFile) {
boolean rightCopy = false;
// -------从源文件中输入内存入byte中,在将byte写入目标文件--------------------
FileInputStream singleFileInputStream = null;
DataInputStream singleDataInputStream = null;
FileOutputStream singleFileOutputStream = null;
DataOutputStream singleDataOutputStream = null;
try {
singleFileInputStream = new FileInputStream(startSingleFile);
singleDataInputStream = new DataInputStream(
new BufferedInputStream(singleFileInputStream));
singleFileOutputStream = new FileOutputStream(desSingleFile);
singleDataOutputStream = new DataOutputStream(
new BufferedOutputStream(singleFileOutputStream));
byte[] b = new byte[1024];
int len;
while ((len = ad(b)) != -1) {
singleDataOutputStream.write(b, 0, len);
}
//刷新缓冲区
singleDataOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (singleDataInputStream != null)
singleDataInputStream.close();
if (singleDataOutputStream != null)
singleDataOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
java创建文件
//判断源文件和目标文件大小是否相同,如果相同证明复制成功
if (startSingleFile.length() == desSingleFile.length())
rightCopy = true;
else
rightCopy = false;
return rightCopy;
}
/**
* 递归复制文件夹,因为文件夹下不止一个文件,里面可能有文件或文件夹,
* 因此需要调用递归方法
* @param startFolder = 需要复制的文件夹
* @param desFolder = 复制目的地的文件夹
* @return = true 表示成功,false 表示失败
*/
public boolean copyFolder(File startFolder, File desFolder) {
boolean rightCopy = false;
rightCopy = this.recursionCopy(startFolder, desFolder);
return rightCopy;
}
/**
* 复制文件夹函数,此函数是个递归,会复制文件夹下的所有文件
*
* @param recFileFolder
* = 需要拷贝的文件夹或子文件夹
* @param recDesFolder
* = 拷贝的目的文件夹或子文件夹,
* @return = true表示成功, false表示失败
*/
private boolean recursionCopy(File recFileFolder, File recDesFolder) {
File desFolder = recDesFolder;
//因为目的文件夹或子文件夹不存在,需要创建
desFolder.mkdir();
//此为需要拷贝的文件夹下的所有文件列表(其中有文件和文件夹)
File[] files = recFileFolder.listFiles();
//如果是个空文件夹
if(files.length==0) return true;
/*
* 将文件夹下所有文件放入for循环,如果是文件,那么调用copySingleFile()拷贝文件,
* 如果是文件夹,那么递归调用此函数
*
*/
for (File thisFile : files) {
// 如果此文件是个文件,那么直接调用单个文件复制命令复制文件
if (thisFile.isFile()) {
// 得到此文件的新位置地址
String desContentFilePath = this.getSubFilePath(startFilePath,desFilePath, AbsolutePath());
boolean rightCopy = this.copySingleFile(thisFile, new File(desContentFilePath));
// 如果复制失败,就跳出循环停止复制
if(!rightCopy) return false;
// 如果是个文件夹
} else {
/*
* 此函数是为了得到目的文件夹的地址,
* 如:源文件夹为:D:/yingzi/text (其中text文件夹下有另一个文件夹 second : D:/yingzi/text/second)
* 目标位置为:E:/aa/text
* 那么此second文件夹在目标地址的位置就是 E:/aa/text/second
*
*/
String desContentFilePath = this.getSubFilePath(startFilePath,desFilePath, AbsolutePath());
// 递归的调用此函数,确保函数都被复制完全
boolean rightCopy = recursionCopy(thisFile, new File(desContentFilePath));
if(!rightCopy) return false;
}
}
return true;
}
/**
* 此函数是为了得到目的文件夹的地址,
* 如:源文件夹为:D:/yingzi/text (其中text文件夹下有另一个文件夹 second : D:/yingzi/text/second)
* 目标位置为:E:/aa/text
* 那么此second文件夹在目标地址的位置就是 E:/aa/text/second
* 此方法中 startFolderPath = D:/yingzi/text (源文件夹) ;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论