package com.sunwin.robot2ips.util;

import org.apache.commons.io.FileUtils;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @name FileUtil.java
 * @author 作者：Sky
 * @time 时间：2017-12-22 下午01:39:15
 * @description 
 * 描述：文件读取 工具
 *
 */
public class FileUtil {
	
	/**
	 * @name getFileNameList
	 * 作者：Sky
	 * 时间：2017-12-22 下午01:39:36
	 * 描述：得到文件夹下所有文件名
	 * @param path 物理路径
	 * @return List<String>
	 */
	public static List<String> getFileNameList(String path) {
		List<String> list = new ArrayList<String>();
		try {
			File file = new File(path);
			String[] filelist = file.list();
			for (int i = 0; i < filelist.length; i++) {
				list.add(filelist[i]);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
	/**
	 * @name getFileList
	 * 作者：Sky
	 * 时间：2017-12-22 下午02:01:43
	 * 描述：得到文件夹下所有文件名，包括目录名
	 * @param path
	 * @return String
	 */
	public static List<String> getFileList(String path) {
		List<String> list = new ArrayList<String>();
		try {
			File file = new File(path);
			String[] filelist = file.list();
			for (int i = 0; i < filelist.length; i++) {
				list.add(path + filelist[i]);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
	/**
	 * @name getAll
	 * 作者：Sky
	 * 时间：2017-12-22 下午01:40:35
	 * 描述：读取指定目录下的所有文件及文件夹
	 * @param path 物理路径
	 * @return List<File>
	 */
	public static List<File> getAll(String path){
		File[] fileArray = new File(path).listFiles();
		return Arrays.asList(fileArray);
	}
	/**
	 * @name getDirectory
	 * 作者：Sky
	 * 时间：2017-12-22 下午01:42:05
	 * 描述：读取指定目录下的所有文件夹，不含文件
	 * @param path 物理路径
	 * @return List<File>
	 */
	public static List<File> getDirectory(String path){
		File[] fileArray = new File(path).listFiles();
		List<File> fileList = new ArrayList<File>();
		for (File file : fileArray) {
			if(file.isDirectory()){
				fileList.add(file);
			}
		}
		return fileList;
	}
	/**
	 * @name getFile
	 * 作者：Sky
	 * 时间：2017-12-22 下午01:42:46
	 * 描述：读取指定目录下的所有文件，不含目录
	 * @param path 物理路径
	 * @return List<File>
	 */
	public static List<File> getFile(String path){
		File[] fileArray = new File(path).listFiles();
		List<File> fileList = new ArrayList<File>();
		for (File file : fileArray) {
			if(file.isFile()){
				fileList.add(file);
			}
		}
		return fileList;
	}
	/**
	 * @name readFileByLine
	 * 作者：Sky
	 * 时间：2017-12-22 下午02:12:27
	 * 描述：按行读文件
	 * @param file
	 * @return List<String>
	 */
	public static List<String> readFileByLine(String file) {
		List<String> res = new ArrayList<String>();
		try {
			FileReader conFile = new FileReader(file);
			BufferedReader readConf = new BufferedReader(conFile);
			String line;
			while (null != (line = readConf.readLine())) {
				//#注释不读取
				if (!line.startsWith("#")) {
					res.add(line);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}
	/**
	 * @name readFile
	 * 作者：Sky
	 * 时间：2017-12-22 下午02:12:45
	 * 描述：读取文件内容
	 * @param file
	 * @return String
	 */
	public static String readFile(String file) {
		String res = new String();
		try {
			FileReader conFile = new FileReader(file);
			BufferedReader readConf = new BufferedReader(conFile);
			String line;
			while (null != (line = readConf.readLine())) {
				 {
					res+=line+"\n\r";
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}
	/**
	 * @name removeFile
	 * 作者：Sky
	 * 时间：2017-12-22 下午02:15:05
	 * 描述：删除文件
	 * @param path
	 */
	public static void deleteFile(String path){
		File file = new File(path);
		if(file.exists()){ 
            if(file.isFile()){
            	file.delete(); 
            }else if(file.isDirectory()){
	             File files[] = file.listFiles(); 
	             for(int i=0;i<files.length;i++){ 
	            	 files[i].delete(); 
	             }
            }
            file.delete(); 
       }else{ 
          System.out.println("该目录为空或文件不存在！"+'\n'); 
       } 
   }
	/**
	 * @name deleteEmptyDir
	 * 作者：Sky
	 * 时间：2017-12-22 下午02:47:40
	 * 描述：删除文件夹
	 * @param path
	 */
	public static  void deleteEmptyDir(String path){
		File file = new File(path);
		file.delete();
	}
	
    /**
     * 递归删除目录下的所有文件及子目录下所有文件
     * @param dir 将要删除的文件目录
     */
	public static void deleteDir(File dir) {
		File[] files = dir.listFiles();
		for (File file : files) {
			//如果是目录，继续遍历
			if(file.isDirectory()){
				deleteDir(file);
			}else{
				//如果不是目录，就删除文件
				file.delete();
			}
		}
		//删除目录
		dir.delete();
    }
	
	 /**
     * 情况文件夹
     * @param path 将要删除的文件
     */
	public static void clearDir(String path) {
		File dir = new File(path);
		if(dir.exists()){ 
			File[] files = dir.listFiles();
			for (File file : files) {
				//如果是目录，继续遍历
				if(file.isDirectory()){
					deleteDir(file);
				}else{
					//如果不是目录，就删除文件
					file.delete();
				}
			}
		}
    }
	
	/**
     * 复制文件
     * @param fromFile
     * @param toFile
     * <br/>
     * 2016年12月19日  下午3:31:50
     * @throws IOException 
     */
    public static void copyFile(File fromFile,File toFile) throws IOException{
    	//方式一
//    	FileInputStream ins = new FileInputStream(fromFile);
//        FileOutputStream out = new FileOutputStream(toFile);
//        byte[] b = new byte[1024];
//        int n=0;
//        while((n=ins.read(b))!=-1){
//            out.write(b, 0, n);
//        }
//        
//        ins.close();
//        out.close();
    	//方式二
    	 FileUtils.copyFile(fromFile, toFile);
    }
	
	/**
	 * @name mkdir
	 * 作者：Sky
	 * 时间：2017-12-22 下午02:47:16
	 * 描述：创建文件夹 
	 * @param path
	 * @return boolean
	 */
	public static  boolean mkdir(String path){
		File file = new File(path);
		return file.mkdir();
	}
	/**
	 * @name createNewFile
	 * 作者：Sky
	 * 时间：2017-12-22 下午02:53:56
	 * 描述：创建文件
	 * @param path
	 * @return boolean
	 */
	public static boolean createNewFile(String path){
		try {
			return new File(path).createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	 * @name writeFile
	 * 作者：Sky
	 * 时间：2017-12-26 上午11:33:44
	 * 描述：写文件
	 * @param path
	 * @param content
	 */
	public static void writeFile(String path,String content){
		try {
			FileWriter writer = new FileWriter(path);
			writer.write(content);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void writeFile(String path,byte[] bt){
		try {
			FileWriter writer = new FileWriter(path);
			for (int i = 0; i < bt.length; i++) {
				byte b = bt[i];
				writer.write(b+"");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	//追加原文件最后写入文件
	public static void writeFileAppend(String path,String content){
		try {
			File file = new File(path);
			if(!file.exists()){
				file.createNewFile();
			}
			FileWriter writer = new FileWriter(path,true);
			writer.write(content);
			writer.write("\r\n"); //换行符
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	 // 判断文件是否存在
    public static boolean fileExist(File file) {
    	return file.exists();
    }

    // 判断文件夹是否存在
    public static boolean dirExists(File file) {
        if (file.exists()) {
            if (file.isDirectory()) {
            	return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    //取文件名后缀
	public static String getFileExtName(File file) {
		String fileName = file.getName();
		return fileName.substring(fileName.lastIndexOf("."));
	}

}
