package net.uvct.util;
 import java.io.File;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOCase;import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
  
 /**
  * 文件工具类
  * @author preference
  *
  */
 public class FileUtils {
     
     public final static int max = 3;//保存文件的数量最大个数
     
     /**
      * 
      * @方法名:getBaseName
      * @方法描述【方法功能描述】从路径中获取去除后缀的文件名
      * @param filename 文件路径
      * @return 去除后缀的文件名
      */
     public static String getBaseName(String filename) {
         return FilenameUtils.getBaseName(filename);
     }
  
     /**
      * 
      * @方法名:getExtension
      * @方法描述【方法功能描述】 从文件路径中获取文件的扩展名
      * @param filename 文件路径
      * @return 文件扩展名
      */
     public static String getExtension(String filename) {
         return FilenameUtils.getExtension(filename);
     }
  
     /**
      * 
      * @方法名:getFullPath
      * @方法描述【方法功能描述】 从文件路径中获取文件的父路径
      * @param filename 文件路径
      * @return 文件的父路径
      */
     public static String getFullPath(String filename) {
         return FilenameUtils.getFullPath(filename);
     }
  
     /**
      * 
      * @方法名:getName
      * @方法描述【方法功能描述】从文件路径中获取文件的全名(包含后缀)
      * @param filename 文件路径
      * @return 文件的全名(包含后缀)
      */
     public static String getName(String filename) {
         return FilenameUtils.getName(filename);
     }
  
     /**
      * 
      * @方法名:concat
      * @方法描述【方法功能描述】拼接目录+文件
      * @param basePath 目录
      * @param fullFilenameToAdd 文件
      * @return 文件路径
      */
     public static String concat(String basePath, String fullFilenameToAdd) {
         return FilenameUtils.concat(basePath, fullFilenameToAdd);
     }
  
     /**
      * 
      * @方法名:directoryContains
      * @方法描述【方法功能描述】查询父文件夹是否包含子文件
      * @param canonicalParent 父目录
      * @param canonicalChild 子文件、子目录
      * @return 父目录是否包含子文件/子目录
      */
     public static boolean directoryContains(String canonicalParent, String canonicalChild) throws IOException {
         return FilenameUtils.directoryContains(canonicalParent, canonicalChild);
  
     }
  
     /**
      * 
      * @方法名:equals
      * @方法描述【方法功能描述】判断两个文件路径是否表示同一文件,会进行格式化,并且不进行大小写区分
      * @param filename1 文件路径1
      * @param filename2 文件路径2
      * @return 两个文件路径是否表示同一文件
      */
     public static boolean equals(String filename1, String filename2) {
         return FilenameUtils.equals(filename1, filename2, true, IOCase.INSENSITIVE);
     }
  
     /**
      * 
      * @方法名:isExtension
      * @方法描述【方法功能描述】判断文件路径的扩展名是否包含在指定扩展名内
      * @param filename 文件路径
      * @param extensions 指定扩展名集合
      * @return 是否包含
      */
     public static boolean isExtension(String filename, String[] extensions) {
         return FilenameUtils.isExtension(filename, extensions);
     }
  
     /**
      * 
      * @方法名:separatorsToSystem
      * @方法描述【方法功能描述】根据系统格式化文件路径
      * @param filename 文件路径
      * @return 格式化后的路径
      */
     public static String separatorsToSystem(String filename) {
         return FilenameUtils.separatorsToSystem(filename);
     }
  
     /**
      * 
      * @方法名:normalize
      * @方法描述【方法功能描述】根据指定系统格式化文件路径
      * @param filename 文件路径
      * @param unixSeparator 是否为unix系统
      * @return 格式化的路径
      */
     public static String normalize(String filename, boolean unixSeparator) {
         return FilenameUtils.normalize(filename, unixSeparator);
     }
  
     /**
      * 
      * @方法名:wildcardMatch
      * @方法描述【方法功能描述】判断文件路径是否能够匹配通配符并指定是否区分大小写
      * @param filename 文件路径
      * @param wildcardMatcher 通配符
      * @param caseSensitivity 是否区分大小写;IOCase.INSENSITIVE不区分大小写;IOCase.SENSITIVE区分大小写;IOCase.SYSTEM根据系统决定
      * @return 是否满足通配符
      */
     public static boolean wildcardMatch(String filename, String wildcardMatcher, IOCase caseSensitivity) {
         return FilenameUtils.wildcardMatch(filename, wildcardMatcher, caseSensitivity);
  
     }
  
     /**
      * 
      * @方法名:changeFilenameSuffix
      * @方法描述【方法功能描述】 修改文件后缀
      * @param name 文件名称或路径
      * @param suffix 新后缀(不带点,如:docx|xls|txtStringUtils.isBlank(suffix))
      * @return 使用新后缀的文件名
      */
     public static String changeFilenameSuffix(String name, String suffix) {
         if (name == null || "".equals(name) || name.lastIndexOf(".") == -1 || suffix == null || "".equals(suffix))
             return name;
         String prefix = name.substring(0, name.lastIndexOf(".") + 1);
         return prefix + suffix;
     }
  
     public static void main(String[] args) {
         try {
         }
         catch (Exception e) {
             System.out.println(e);
         }
     }
     /**
      * 文件还原功能
      * 
      * 删除文件夹中最早产生的一个文件,如csv文件夹永远只保留max=3个最新的文件,超过3则删除一个文件
      * 注意:是根据文件命名来delete的,所以必须要有公共的命名规则
      * @param commonFileSuffix 文件夹下的文件名的公共后缀:如_areaMes.js
      * @param fileDir          文件夹名称
      * @param format           时间格式
      */
     public static void deleteFurthestFile(String fileDir, String format, final String commonFileSuffix) {
         try {
             File dir = new File(fileDir);
             if (!dir.exists())
                 return;
             int currentNum = 0;
             if (dir.exists())
                 currentNum = dir.listFiles().length;  //得到当前文件夹文件数目
             if (currentNum > max) { //删除产生时间最早的一个文件
                 //得到文件名的一个map
                 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
                 Map<Long, String> map = new HashMap<>();
                 for (File file1 : dir.listFiles()) {
                     String time = file1.getName().replace(commonFileSuffix, "");
                     Date date = simpleDateFormat.parse(time);
                     map.put(date.getTime(), file1.getName()); //  <1233282716409,2018-2-1_log.txt>
                 }
  
                 //产生时间最早的文件名
                 long lt = Long.valueOf(Collections.min(map.keySet()).toString());
                 File f1 = new File(fileDir + map.get(lt));
                 if (f1.exists())
                     f1.delete();
             }
         } catch (ParseException e) {
             e.printStackTrace();
         }catch (Exception e) {
             e.printStackTrace();
         }
     }
 }