package com.nms.server.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Comparator;
import java.util.List;

/**
 * 继承org.apache.commons.io.FileUtils类，继承其对文件的各项操作
 * 并增加文件检索方法，丰富己用
 * 主要新增操作：检索、排序
 *  @date Sep 6, 2011 2:28:14 PM
 *	@author ZhangGang
 *
 */
public class FileUtils extends org.apache.commons.io.FileUtils{
	
	/**
	 * 将字节写入新文件
	 * @time Jan 13, 2013-2:46:11 PM
	 * @param bts	存放文件字节数组
	 * @param filePath	写入的目标文件路径
	 * @throws IOException
	 */
	public static void wirteBytesToFile(byte [] bts,String filePath) throws IOException{
		File file = new File(filePath);
		wirteBytesToFile(bts, file);
	}
	
	/**
	 * 将字节写入新文件
	 * @time Jan 13, 2013-2:46:11 PM
	 * @param bts	存放文件字节数组
	 * @param file	写入的目标文件
	 * @throws IOException
	 */
	public static void wirteBytesToFile(byte [] bts,File file) throws IOException{
		FileOutputStream fos = null;
		try {
			/* 检查并创建文件路径 */
			if(!file.getParentFile().exists()){
				file.getParentFile().mkdirs();
			}
			
			/* 删除旧文件 */
			if(file.exists()){
				file.delete();
			}
			
			/* 创建新文件 */
			file.createNewFile();
			
			/* 将字节写入文件*/
			if(bts != null && bts.length>0){
				
				/* 创建文件输出流写文件 */
				fos = new FileOutputStream(file);
				fos.write(bts);
			}
			
		} catch (IOException e) {
			throw e;
		}finally{
			if(fos!= null){fos.close();}
		}
	}
	
	
	
	/**
	 * 文件过滤
	 * @time Sep 6, 2011-5:01:51 PM
	 * @param file
	 * @param suffix
	 * @param spaces
	 */
	public static void folderIterator(File file,String suffix,String spaces) {
		if(file.exists()){		//文件存在才有意义检索
			/*检索符合规则的文件 将文件添加到 待解析文件序列*/
			File [] files = listFilesEndWith(file,suffix);
			files = sortByFileModifyASC(files);		//修改日期升序排序
			if(files != null ){
				for(File file0 : files){
					System.out.println(spaces+"00 "+file0.getName()+" "+file0.lastModified());
				}
			}
			/*检索 检索目录下文件目录 进行下一级检索*/
			File [] files2 = listFilesForDirectory(file);
			if(files2 != null ){
				for(File file0 : files2){
					System.out.println(spaces+"== "+file0.getName()+" "+file0.lastModified());
					folderIterator(file0,suffix,spaces+"\t");
				}
			}
		}
	}
	
	/**获取指定全部或部分名称的文件
	 * @param file
	 * @param azz
	 * @return
	 */
	public static File [] listFilesWith(File file,final String azz){
		if(!file.isDirectory()){
			new Exception(file.getAbsolutePath() + " Not A Directory");
		}
		return file.listFiles(new FilenameFilter() {
             // 使用匿名内部类重写accept方法;
             public boolean accept(File dir, String name) {
                 if (new File(dir, name).isDirectory()) {
                     return false;
                 }
                 return name.indexOf(azz) != -1 ;		// 过滤出指定全部名称或部分名称的文件
             }
         });
	}
	
	/**获取指定后缀名的文件
	 * @param file
	 * @param suffix
	 * @return
	 */
	public static File []  listFilesEndWith(File file,final String suffix){
		if(!file.isDirectory()){
			new Exception(file.getAbsolutePath() + " Not A Directory");
		}
		return file.listFiles(new FilenameFilter() {
             // 使用匿名内部类重写accept方法;
             public boolean accept(File dir, String name) {
                 if (new File(dir, name).isDirectory()) {
                     return false;
                 }
                 return name.endsWith(suffix);		// 过滤出注定后缀名称的文件
             }
         });
	}
	
	/**获取指定目录里，所有符合后指定后缀名的文件
	 * @param file
	 * @param suffix
	 * @return
	 */
	
	//根据给定的目录产生所有的文件对象数组
	public static File[] listAllFilesEndWith(File file,String suffix) {
		File[] files = new File[0];
		List<File> fileGroup = new ArrayList<File>();
		try {
			generateAllFilesEndWith(file,suffix,fileGroup);
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		return fileGroup.toArray(files);
	}
	
	public static void generateAllFilesEndWith(File file,String suffix,List<File> fileGroup) {
		try {
			if(file.exists()&&file.isDirectory()) {
				File[] fileList = file.listFiles();
				for(File f:fileList) {
					if(f.exists()) {//文件夹作为节点
						if(f.isDirectory()) {
							generateAllFilesEndWith(f,suffix,fileGroup);
						}else if(isRightSuffix(f,suffix)) {
							fileGroup.add(f);
						}
					} 
				}
			}else {
				fileGroup.add(file);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}
	
	//文件后缀名是否符合指定字符串
	public static boolean isRightSuffix(File file,String suffix) {
		boolean canRead = false;
		String fileName = file.getName();
		String extensionName = fileName.substring(fileName.lastIndexOf(".")+1);
		if(file.isFile()&&suffix.equals(extensionName)) {
			canRead = true; 
		}
		return canRead;
	}
	
	public static Calendar getModifiedTime(File f){          
		   Calendar cal = Calendar.getInstance();           
		   long time = f.lastModified();           
//		   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                  
		   cal.setTimeInMillis(time);           
//		   Date date = cal.getTime();
//		   System.out.println("修改时间[2] " + formatter.format(cal.getTime()));              //输出：修改时间[2]    2009-08-17 10:32:38
		   
		   return cal;
	}   
	
	//删除文件夹里的所有文件
	public static void deleteAllFiles(String path,boolean delSelf) {
		File tmpFile = new File(path);
		deleteAllFiles(tmpFile,delSelf);
	}
	
	//删除文件夹里的所有文件
	public static void deleteAllFiles(File tmpFile,boolean delSelf) {
		if(tmpFile!=null&&tmpFile.isDirectory()) {
			File[] filesGroup = tmpFile.listFiles();
			deleteFiles(filesGroup);
			if(delSelf) {//是否删除自身
				tmpFile.delete();
			}
		}else if(tmpFile!=null&&tmpFile.isFile()&&delSelf) {
			tmpFile.delete();
		}
	}
	
	public static void deleteFiles(File[] fileGroup) {
		for(File file:fileGroup) {
			if(file!=null && file.isFile()) {
				file.delete();
			}else if(file!=null&&file.isDirectory()){
				File[] files = file.listFiles();
				deleteFiles(files);
				file.delete();
			}			
		}		
	}
	
	public static void main(String[] args) {
		deleteAllFiles("D:\\ControllerData\\dc_error\\qq",true);
	}
	
	
	
	/**获取指定后缀名的文件
	 * @param file
	 * @param suffix
	 * @return
	 */
	public static File []  listFilesEndWithout(File file,final String suffix){
		if(!file.isDirectory()){
			new Exception(file.getAbsolutePath() + " Not A Directory");
		}
		return file.listFiles(new FilenameFilter() {
             // 使用匿名内部类重写accept方法;
             public boolean accept(File dir, String name) {
                 if (new File(dir, name).isDirectory()) {
                     return false;
                 }
                 return !name.endsWith(suffix);		// 过滤出注定后缀名称的文件
             }
         });
	}
	/**获取指定后缀名的文件
	 * @param file
	 * @param suffix
	 * @return
	 */
	public static String[]  listFileNamesEndWith(File file,final String suffix){
		if(!file.isDirectory()){
			new Exception(file.getAbsolutePath() + " Not A Directory");
		}
		return file.list(new FilenameFilter() {
             // 使用匿名内部类重写accept方法;
             public boolean accept(File dir, String name) {
                 if (new File(dir, name).isDirectory()) {
                     return false;
                 }
                 return name.endsWith(suffix);		// 过滤出注定后缀名称的文件
             }
         });
	}
	
	/**获取指定后缀名的文件
	 * @param file
	 * @param suffix
	 * @return
	 */
	public static String[]  listFileNamesEndWithout(File file,final String suffix){
		if(!file.isDirectory()){
			new Exception(file.getAbsolutePath() + " Not A Directory");
		}
		return file.list(new FilenameFilter() {
             // 使用匿名内部类重写accept方法;
             public boolean accept(File dir, String name) {
                 if (new File(dir, name).isDirectory()) {
                     return false;
                 }
                 return !name.endsWith(suffix);		// 过滤出注定后缀名称的文件
             }
         });
	}
	/**获取子目录列表
	 * @param file
	 * @return
	 */
	public static File [] listFilesForDirectory(File file){
		if(!file.isDirectory()){
			new Exception(file.getAbsolutePath() + " Not A Directory");
		}
		return  file.listFiles(new FilenameFilter() {
            // 使用匿名内部类重写accept方法;
            public boolean accept(File dir, String name) {
                if (new File(dir, name).isDirectory()) {
                    return true;
                }else return false;
            }
        });
	}
	/**
	 * 文件数组按最后修改日期排序，升序
	 * @time Aug 5, 2011-1:32:36 PM
	 * @param files
	 * @return
	 */
	public static File [] sortByFileModifyASC(File[] files) {
		Arrays.sort(files, new Comparator<File>(){
			public int compare(File arg0, File arg1) {
				if(arg0.lastModified() > arg1.lastModified()){
					return -1;
				}else if (arg0.lastModified() < arg1.lastModified()){
					return 1;
				}else {
					return 0;
				}
			}
		});
		return files;
	}
	
	/**
	 * 文件数组按名称排序，升序
	 * @time Aug 5, 2011-1:32:36 PM
	 * @param files
	 * @return
	 */
	public static File [] sortByFileNameASC(File[] files) {
		Arrays.sort(files, new Comparator<File>(){
			public int compare(File arg0, File arg1) {
				return arg0.getName().compareTo(arg1.getName());
			}
		});
		return files;
	}
	
	/**
	 * 
	 * 保存对象到文件
	 * @author Administrator Feb 22, 2013
	 * @version 1.0 
	 * @param path
	 */
	public static void writeObjToFile(Object obj,File file){   
        FileOutputStream fos = null;  
        ObjectOutputStream oos = null;  
        try {  
        	
        	/* 检查并创建文件路径 */
			if(file!=null&&!file.getParentFile().exists()){
				file.getParentFile().mkdirs();
			}
			
//			/* 删除旧文件 */
//			if(file.exists()){
//				file.delete();
//			}else {
//				/* 创建新文件 */
//				file.createNewFile();
//				
//			}
			
			if(obj != null){
				
				fos = new FileOutputStream(file);//默认是覆盖，true是追加
	            oos = new ObjectOutputStream(fos);
	            oos.writeObject(obj);    //括号内参数为要保存java对象   
			}
        	
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }finally{  
            try {  
            	if(oos!=null) {
            		oos.close();  
            	}
            	if(fos!=null) {
            		fos.close();  
            	}
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }     
    }  
    
	/**
	 * 
	 * 从文件读取对象 
	 * @author Administrator Feb 22, 2013
	 * @version 1.0 
	 * @param path
	 */
	public static Object readObjFomFile(File file){  
        FileInputStream fis = null;  
        ObjectInputStream ois = null;     
        Object obj = null;
        try {  
        	if(file != null && file.exists() && file.length()>0 ){
	            fis = new FileInputStream(file);  
	            ois = new ObjectInputStream(fis);  
	            obj = ois.readObject();//强制类型转换   
        	}
              
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        }finally{  
            try {  
            	if(ois!=null) {
            		ois.close();  
            	}
            	if(fis!=null) {
            		fis.close();  
            	}
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        } 
        return obj;
    }  

}
