package com.csdn.exam.eighth;
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;
/**
*
* @author tianzhw
*
*/
public class CopyFileUtil {
private static int FILE_SIZE = 1024 * 5;
/**
* 复制单个文件,如果目标文件存在,则不复制
*
* @param srcFileName
* @param dextFileName
* @return
*/
public static boolean copyFile(String srcFileName, String dextFileName) {
return CopyFileUtil.copyFile(srcFileName, dextFileName, false);
}
/**
* 复制单个文件
*
* @param srcFileName
* 待复制文件路径
* @param dextFileName
* 目标文件路径
* @param b
* 如果目标文件存在,是否覆盖
* @return 如果成功返回true,不成功返回false
*/
private static boolean copyFile(String srcFileName, String dextFileName,
boolean b) {
// TODO Auto-generated method stub
File srcFile = new File(srcFileName);
if (!srcFile.exists()) {
System.out.println("复制文件失败:源文件" + srcFile.getName() + "不存在");
return false;
}else if(!srcFile.isFile())
{
System.out.println("复制文件失败:源文件" + srcFile.getName() + "不是一个文件");
return false;
}
File destFile=new File(dextFileName);
//判断目标文件是否存在
if(destFile.exists())
{
//如果目标文件存在,并且允许覆盖
if(b)
{
System.out.println("目标文件存在,准备删除它!");
if(!destFile.delete())
{
System.out.println("已存在文件删除不成功!");
return false;
}
}
else
{
System.out.println("复制文件失败:目标文件"+ dextFileName +"已经存在");
return false;
}
}else{
if(!destFile.getParentFile().exists())
{
System.out.println("目标文件所在目录不存在,准备创建它!");
if(!destFile.getParentFile().mkdirs())
{
System.out.println("复制文件失败,创建目标文件目录失败!");
return false;
}
}
}
int res=0;
try {
res=copyFile(new FileReader(srcFile),new FileWriter(destFile));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(res!=0)
{
return true;
}
return false;
}
private static int copyFile(Reader in,Writer out) {
// TODO Auto-generated method stub
int byteCount = 0;
try {
int bytesReader = -1;
char[] buffer = new char[FILE_SIZE];
try {
while ((bytesReader = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesReader);
byteCount += bytesReader;
}
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} finally {
try {
in.close();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return byteCount;
}
/**
* 复制整个目录的内容,如果目标目录存在则不复制
* @param scrDirName
* @param destDirName
* @return 如果成功返回true 如果失败返回false
*/
public static boolean copyDirectory(String srcDirName,String destDirName)
{
return CopyFileUtil.copyDirectory(srcDirName, destDirName, false);
}
private static boolean copyDirectory(String srcDirName, String destDirName,
boolean b) {
// TODO Auto-generated method stub
File srcDir = new File(srcDirName);
if(!srcDir.exists())
{
System.out.println("复制目录失败:原因"+srcDir+"不存在");
return false;
}else if(!srcDir.isDirectory())
{
System.out.println("复制目录失败:原因"+srcDir+"不是一个目录");
return false;
}
//如果文件名不是以文件分隔符结尾,自动添加文件分隔符
if(!destDirName.endsWith(File.separator)){
destDirName = destDirName + File.separator;
}
File destDir = new File(destDirName,srcDir.getName());
if(destDir.exists())
{
if(b){
System.out.println("目标目录已经存在,准备它 ");
if(!destDir.delete())
{
System.out.println("复制目录失败:原因删除目录" + destDirName+"失败");
return false;
}
}
else
{
System.out.println("复制目录失败:原因"+destDirName+"以存在");
return false;
}
}
boolean flag=true;
File[] files=srcDir.listFiles();
for(File file:files)
{
if(file.isFile())
{
flag=CopyFileUtil.copyFile(file.getAbsolutePath(),destDirName+file.getName());
if(!flag)
{
break;
}
}
if(file.isDirectory())
{
flag=CopyFileUtil.copyDirectory(file.getAbsolutePath(),destDirName+file.getName());
if(!flag)
{
break;
}
}
}
return true;
}
}