需求:将某一路径下的满足条件的根目录下的若干子目录及文件复制到另一路径下(保留原目录文件结构,但需要把子目录下名称为.svn的目录过滤掉).
一.实现分两部分:
1. 将根目录下的满足条件的子目录复制到新路径
2. 将新路径,子目录下的所有.svn目录删除
代码如下:
public static boolean folderCopy(String src, String des) {
File srcFile = new File(src);
File desFile = new File(des);
File[] files = srcFile.listFiles();
boolean flag = false;
if (!desFile.exists())
desFile.mkdir();
for (int i = 0; i < files.length; i++) {
String path = files[i].getAbsolutePath();
if (files[i].isDirectory()) {
File newFile = new File("path.replace(src,des)");
if (!newFile.exists())
newFile.mkdir();// 不存在新建文件夹
folderCopy(path, path.replace(src, des));
} else
flag = fileCopy(path, path.replace(src, des));// 文件复制函数
}
return flag;
}
public static boolean fileCopy(String src, String des) {
File srcFile = new File(src);
File desFile = new File(des);
byte[] b = new byte[1024];
String string = "";
try {
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(desFile, false);
while (true) {
int i = fis.read(b);
if (i == -1)
break;
fos.write(b, 0, i);
}
fos.close();
fis.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
以下两个方法是目录及文件复制方法,用法如下
首先,定义一个方法(过滤条件)
private static boolean isSourceFile(String fileName) {
if ("base".equalsIgnoreCase(fileName)
|| "saas".equalsIgnoreCase(fileName)
|| "jquery".equalsIgnoreCase(fileName)
|| "jquery-ui-1.8.20".equalsIgnoreCase(fileName)) {
return true;
} else {
return false;
}
}
用递归法,实现某目录及其子目录下.svn目录的删除
public boolean DeleteFolder(String sPath) {
boolean flag = false;
File file = new File(sPath);
// 判断目录或文件是否存在
if (!file.exists()) { // 不存在返回 false
return flag;
} else {
// 判断是否为文件
if (file.isFile()) { // 为文件时调用删除文件方法
return deleteFile(sPath);
} else { // 为目录时调用删除目录方法
return deleteDirectory(sPath);
}
}
}
/**
* 删除单个文件
* @param sPath 被删除文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
private static boolean deleteFile(String sPath) {
boolean flag = false;
File file = new File(sPath);
// 路径为文件且不为空则进行删除
if (file.isFile() && file.exists()) {
file.delete();
flag = true;
}
return flag;
}
/**
* 删除目录(文件夹)以及目录下的文件
* @param sPath 被删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
private static boolean deleteDirectory(String sPath) {
//如果sPath不以文件分隔符结尾,自动添加文件分隔符
if (!sPath.endsWith(File.separator)) {
sPath = sPath + File.separator;
}
File dirFile = new File(sPath);
//如果dir对应的文件不存在,或者不是一个目录,则退出
if (!dirFile.exists() || !dirFile.isDirectory()) {
return false;
}
boolean flag = true;
//删除文件夹下的所有文件(包括子目录)
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
//删除子文件
if (files[i].isFile()) {
flag = deleteFile(files[i].getAbsolutePath());
if (!flag) break;
} //删除子目录
else {
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag) break;
}
}
if (!flag) return false;
//删除当前目录
if (dirFile.delete()) {
return true;
} else {
return false;
}
}
// 递归删除某目录及其子目录下的.svn目录
private static void deletesvn(String path){
File file = new File(path);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f:files) {
if (f.getName().equals(".svn")) {
deleteDirectory(f.getPath());
}else {
deletesvn(f.getPath());
}
}
}
}
根据过滤条件及目录,文件复制方法,定义调用
private static final String htfsweb = "D:/原路径/js";
private static final String htfsweb2 = "C:/目标路径/js";
public static void fileList(File file) {
File[] files = file.listFiles();
// 复制指定目录及文件
if (files != null) {
for (File f : files) {
String fname = f.getName();
if (isSourceFile(fname)) {
folderCopy(f.getPath(), htfsweb2 + "/" + fname);
deletesvn(htfsweb2 + "/" + fname);
}
System.out.println(f.getName());
}
}
}
main方法测试代码:
public static void main(String[] args) {
fileList(new File(htfsweb));
}
二.文件合并
需求:将目录及其子目录下所有以"_"开始的所有文件合并成一个文件并放置在当前目录下,合成的文件名以"目录名_combine.js"命名.
private static void combineFiles(List<File> files,String saveFileName) throws IOException{
File mFile=new File(saveFileName);
if(!mFile.exists()){
mFile.createNewFile();
}
FileChannel mFileChannel = new FileOutputStream(mFile).getChannel();
FileChannel inFileChannel;
for(File file:files){
inFileChannel=new FileInputStream(file).getChannel();
inFileChannel.transferTo(0, inFileChannel.size(), mFileChannel);
inFileChannel.close();
}
mFileChannel.close();
}
private static void combine(String path){
File file = new File(path);
List<File> list = new ArrayList<File>();
String target = null;
if (file.isDirectory()) {
File[] files = file.listFiles();
for(File f:files){
System.out.println(f.getName());
if (f.isFile() && f.getName().startsWith("_")) {
target = f.getParentFile().getPath();
list.add(f);
}else {
combine(f.getPath());
}
}
System.out.println(list);
System.out.println("======");
System.out.println(target);
try {
if (list.size()>0) {
combineFiles(list, target+target.substring(target.lastIndexOf("\\"))+"_combine.js");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
方法笨了点,之后再做简化;