目录及文件的过滤性复制;及文件的合并

需求:将某一路径下的满足条件的根目录下的若干子目录及文件复制到另一路径下(保留原目录文件结构,但需要把子目录下名称为.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();
			}
		}
    }
方法笨了点,之后再做简化;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值