FileUtil

 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

/**
 * 功能:该类用于操作文件和文件夹
 * 作者:邵江
 * 时间:2011.7.21
 * 版本:0.1
 */
public class FileUtil {
    
	/**
     * 将源文件的数据写入到目标文件中,
     * 不会检查源文件是否存在,
     * 若目标文件存在则直接写入,
     * 否则创建目标文件后再进行写入。
     * @param srcPath
     * @param desPath
     */
    private static void copyFile(String srcPath,String desPath){
        try {
            FileInputStream in = new FileInputStream(srcPath);
            FileOutputStream out = new FileOutputStream(desPath);
            byte[] bt = new byte[1024];
            int count;
            while ((count = in.read(bt)) > 0) {
                out.write(bt, 0, count);
            }
            in.close();
            out.close(); 
        } catch (IOException ex) {
            ex.printStackTrace();
        }    	
    }
    
    /**
     * 复制文件,若文件存在则替换该文件。
     * @param srcPath
     * @param desPath
     * @throws Exception
     */
    public static void copyAndReplaceFile(String srcPath,String desPath) throws Exception{
    	srcPath = separatorReplace(srcPath);
    	desPath = separatorReplace(desPath);
    	File srcFile = new File(srcPath);
    	if(!srcFile.isFile()){
    		throw new Exception("source file not found!");
    	}
    	copyFile(srcPath,desPath);
    }
    
    /**
     * 复制文件,若文件已存在则不进行替换。
     * @param srcPath
     * @param desPath
     * @throws Exception
     */
    public static void copyAndNotReplaceFile(String srcPath,String desPath) throws Exception{
    	srcPath = separatorReplace(srcPath);
    	desPath = separatorReplace(desPath);
    	File srcFile = new File(srcPath);
    	File desFile = new File(desPath);
    	if(!srcFile.isFile()){
    		throw new Exception("source file not found!");
    	}
    	if(desFile.isFile()){
    		return;
    	}
    	copyFile(srcPath,desPath);
    }
    
    /**
     * 移动文件,若文件存在则替换该文件。
     * @param srcPath
     * @param desPath
     * @throws Exception
     */
    public static void moveAndReplaceFile(String srcPath,String desPath) throws Exception{
    	srcPath = separatorReplace(srcPath);
    	desPath = separatorReplace(desPath);
    	copyAndReplaceFile(srcPath,desPath);
    	deleteFile(srcPath);
    }
    
    /**
     * 移动文件,若文件存在则不进行替换。
     * @param srcPath
     * @param desPath
     * @throws Exception
     */
    public static void moveAndNotReplaceFile(String srcPath,String desPath) throws Exception{
    	srcPath = separatorReplace(srcPath);
    	desPath = separatorReplace(desPath);
    	copyAndNotReplaceFile(srcPath,desPath);
    	deleteFile(srcPath);
    }
    
    /**
     * 复制并合并文件夹,
     * 不会替换目标文件夹中已经存在的文件或文件夹。
     * @param srcPath
     * @param desPath
     * @throws Exception 
     */
    public static void copyAndMergerFolder(String srcPath,String desPath) throws Exception{    	
    	srcPath = separatorReplace(srcPath);
    	desPath = separatorReplace(desPath);
    	File folder = getFolder(srcPath);
    	createFolder(desPath);
    	File[] files = folder.listFiles();
    	for(File file:files){
    		String src = file.getAbsolutePath();
    		String des = desPath+File.separator+file.getName();
    		if(file.isFile()){
    			copyAndNotReplaceFile(src,des);
    		}else if(file.isDirectory()){
    			copyAndMergerFolder(src,des);
    		}
    	}
    }
    
    /**
     * 复制并替换文件夹,
     * 将目标文件夹完全替换成源文件夹,
     * 目标文件夹原有的资料会丢失。
     * @param srcPath
     * @param desPath
     * @throws Exception 
     */
    public static void copyAndReplaceFolder(String srcPath,String desPath) throws Exception{   
    	srcPath = separatorReplace(srcPath);
    	desPath = separatorReplace(desPath);
    	File folder = getFolder(srcPath);
    	createNewFolder(desPath);
    	File[] files = folder.listFiles();
    	for(File file:files){
    		String src = file.getAbsolutePath();
    		String des = desPath+File.separator+file.getName();
    		if(file.isFile()){
    			copyAndReplaceFile(src,des);
    		}else if(file.isDirectory()){
    			copyAndReplaceFolder(src,des);
    		}
    	}
    } 
    
    /**
     * 合并文件夹后,将源文件夹删除。
     * @param srcPath
     * @param desPath
     * @throws Exception 
     */
    public static void moveAndMergerFolder(String srcPath,String desPath) throws Exception{
    	srcPath = separatorReplace(srcPath);
    	desPath = separatorReplace(desPath);    	
    	copyAndMergerFolder(srcPath,desPath);
    	deleteFolder(srcPath);
    }
    
    /**
     * 替换文件夹后,将源文件夹删除。
     * @param srcPath
     * @param desPath
     * @throws Exception 
     */
    public static void moveAndReplaceFolder(String srcPath,String desPath) throws Exception{
    	srcPath = separatorReplace(srcPath);
    	desPath = separatorReplace(desPath);
    	copyAndReplaceFolder(srcPath,desPath);
    	deleteFolder(srcPath);
    }    

    /**
     * 创建文件夹,如果文件夹存在则不进行创建。
     * @param path
     * @throws Exception 
     */
    public static void createFolder(String path) throws Exception{
    	path = separatorReplace(path);
    	File folder = new File(path);
    	if(folder.isDirectory()){
    		return;
    	}else if(folder.isFile()){
    		deleteFile(path);
    	}
    	folder.mkdirs();
    }
    
    /**
     * 创建一个新的文件夹,如果文件夹存在,则删除后再创建。
     * @param path
     * @throws Exception
     */
    public static void createNewFolder(String path) throws Exception{
    	path = separatorReplace(path);
    	File folder = new File(path);
    	if(folder.isDirectory()){
    		deleteFolder(path);
    	}else if(folder.isFile()){
    		deleteFile(path);
    	}
    	folder.mkdirs();
    }
    
    /**
     * 创建一个文件,如果文件存在则不进行创建。
     * @param path
     * @throws Exception
     */
    public static File createFile(String path) throws Exception{
    	path = separatorReplace(path);
    	File file = new File(path);
    	if(file.isFile()){
    		return file;
    	}else if(file.isDirectory()){
    		deleteFolder(path);
    	}
    	return createFile(file);
    }
    
    /**
     * 创建一个新文件,如果存在同名的文件或文件夹将会删除该文件或文件夹,
     * 如果父目录不存在则创建父目录。
     * @param path
     * @throws Exception
     */
    public static File createNewFile(String path) throws Exception{
    	path = separatorReplace(path);
    	File file = new File(path);
    	if(file.isFile()){
    		deleteFile(path);
    	}else if(file.isDirectory()){
    		deleteFolder(path);
    	}
    	return createFile(file);
    }
    
    /**
     * 分隔符替换
     * window下测试通过
     * @param path
     * @return
     */
    public static String separatorReplace(String path){
    	return path.replace("\\","/");
    }
    
    /**
     * 创建文件及其父目录。
     * @param file
     * @throws Exception
     */
    public static File createFile(File file) throws Exception{
    	createParentFolder(file);
    	if(!file.createNewFile()) {
    		throw new Exception("create file failure!");
    	}
    	return file;
    }
    
    /**
     * 创建父目录
     * @param file
     * @throws Exception
     */
    private static void createParentFolder(File file) throws Exception{
    	if(!file.getParentFile().exists()) {
    		if(!file.getParentFile().mkdirs()) {
    			throw new Exception("create parent directory failure!");
    		}
    	}
    }
    
    /**
     * 根据文件路径删除文件,如果路径指向的文件不存在或删除失败则抛出异常。
     * @param path
     * @return
     * @throws Exception 
     */
    public static void deleteFile(String path) throws Exception {
    	path = separatorReplace(path);
        File file = getFile(path);    
        if(!file.delete()){
        	throw new Exception("delete file failure");
        }                      
    }
    
    /**
     * 删除指定目录中指定前缀和后缀的文件。
     * @param dir
     * @param prefix
     * @param suffix
     * @throws Exception 
     */
    public static void deleteFile(String dir,String prefix,String suffix) throws Exception{     
    	dir = separatorReplace(dir);
    	File directory = getFolder(dir);
    	File[] files = directory.listFiles();
    	for(File file:files){
    		if(file.isFile()){
    			String fileName = file.getName();
    			if(fileName.startsWith(prefix)&&fileName.endsWith(suffix)){
    				deleteFile(file.getAbsolutePath());
    			}
    		}
    	}    
    }
    
    /**
     * 根据路径删除文件夹,如果路径指向的目录不存在则抛出异常,
     * 若存在则先遍历删除子项目后再删除文件夹本身。
     * @param path
     * @throws Exception 
     */
    public static void deleteFolder(String path) throws Exception {
    	path = separatorReplace(path);
        File folder = getFolder(path);
        File[] files = folder.listFiles(); 
        for(File file:files) {                
            if(file.isDirectory()){
            	deleteFolder(file.getAbsolutePath());
            }else if(file.isFile()){                	
            	deleteFile(file.getAbsolutePath());                                	
            }
        }  
        folder.delete(); 
    }
    
    /**
     * 查找目标文件夹下的目标文件
     * @param dir
     * @param fileName
     * @return
     * @throws FileNotFoundException
     */
    public static File searchFile(String dir,String fileName) throws FileNotFoundException{
    	dir = separatorReplace(dir);
    	File f = null;
        File folder = getFolder(dir);
        File[] files = folder.listFiles(); 
        for(File file:files) {                
            if(file.isDirectory()){
            	f =  searchFile(file.getAbsolutePath(),fileName);
            	if(f!=null){
            		break;
            	}
            }else if(file.isFile()){ 
            	if(file.getName().equals(fileName)){
            		f = file;
            		break;
            	}            			                                	
            }
        }          
    	return f;
    }
          
    /**
     * 获得文件类型。
     * @param path:文件路径
     * @return
     * @throws FileNotFoundException 
     */
	public static String getFileType(String path) throws FileNotFoundException {
		path = separatorReplace(path);
		File file = getFile(path);
		String fileName = file.getName();
		String[] strs = fileName.split("\\.");
		if(strs.length<2){
			return "unknownType";
		}
		return strs[strs.length-1];
	}
	
	/**
	 * 根据文件路径,获得该路径指向的文件的大小。
	 * @param path
	 * @return
	 * @throws FileNotFoundException
	 */
	public static long getFileSize(String path) throws FileNotFoundException{
		path = separatorReplace(path);		
		File file = getFile(path);
		return file.length();
	}
	
	/**
	 * 根据文件夹路径,获得该路径指向的文件夹的大小。
	 * 遍历该文件夹及其子目录的文件,将这些文件的大小进行累加,得出的就是文件夹的大小。
	 * @param path
	 * @return
	 * @throws FileNotFoundException
	 */
	public static long getFolderSize(String path) throws FileNotFoundException{
		path = separatorReplace(path);				
		long size = 0;
		File folder = getFolder(path);
		File[] files = folder.listFiles();
		for(File file:files){
			if(file.isDirectory()){
				size += getFolderSize(file.getAbsolutePath());
			}else if(file.isFile()){
				size += file.length();
			}
		}
		return size;
	}
	
	/**
	 * 通过路径获得文件,
	 * 若不存在则抛异常,
	 * 若存在则返回该文件。
	 * @param path
	 * @return
	 * @throws FileNotFoundException
	 */
	public static File getFile(String path) throws FileNotFoundException{
		path = separatorReplace(path);				
		File file = new File(path);
		if(!file.isFile()){
			throw new FileNotFoundException("file not found!");
		}
		return file;
	}
	
	/**
	 * 通过路径获得文件夹,
	 * 若不存在则抛异常,
	 * 若存在则返回该文件夹。
	 * @param path
	 * @return
	 * @throws FileNotFoundException
	 */
	public static File getFolder(String path) throws FileNotFoundException{
		path = separatorReplace(path);				
		File folder = new File(path);
		if(!folder.isDirectory()){
			throw new FileNotFoundException("folder not found!");
		}
		return folder;
	}
	
	/**
	 * 获得文件最后更改时间。
	 * @param path
	 * @return
	 * @throws FileNotFoundException
	 */
	public static Date getFileLastModified(String path) throws FileNotFoundException{
		path = separatorReplace(path);				
		File file = getFile(path);
		return new Date(file.lastModified());
	}
	
	/**
	 * 获得文件夹最后更改时间。
	 * @param path
	 * @return
	 * @throws FileNotFoundException
	 */
	public static Date getFolderLastModified(String path) throws FileNotFoundException{
		path = separatorReplace(path);		
		File folder = getFolder(path);
		return new Date(folder.lastModified());
	}
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sjiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值