(java)获取某文件夹下面所有的指定类型的文件名称,并根据情况返回可用的名称

(java)获取某文件夹下面所有的指定类型的文件名称,并根据情况返回可用的名称

检查磁盘上指定目录是否已经存在同名文件(本代码是检查.jpg文件类型),存在三种情况:
  * 1:不存在,返回查询的名称
           如:输入abc,返回abc
  * 2:存在一个名称相同的文件,返回“预定义的名称+当前日期+001”的新名称
           如:存在一个叫abc.jpg的文件,输入abc,返回abc20101227001
  * 3:存在多个前缀名相同的文件,则返回比编号最大的文件大一个编号的名称

           如:存在abc.jpgabc20101227001abc20101227002abc201012270023的文件,输入abc,返回abc20101227024

======================代码开始==================

 

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileDirectorySearch {

 /**
  * 创建查询指定目录下文件的方法
  *
  * @param allList
  *            指定目录
  * @param endName
  *            指定以“”结尾的文件
  * @return 得到的文件数目
  */
 public int findTxtFileCount(File allList, String endName) {
  int textCount = 0;
  // 创建fileArray名字的数组
  File[] fileArray = allList.listFiles();
  // 如果传进来一个以文件作为对象的allList 返回0
  if (null == fileArray) {
   return 0;
  }
  // 偏历目录下的文件
  for (int i = 0; i < fileArray.length; i++) {
   // 如果是个目录
   if (fileArray[i].isDirectory()) {
    // System.out.println("目录: "+fileArray[i].getAbsolutePath());
    // 递归调用
    textCount += findTxtFileCount(fileArray[i].getAbsoluteFile(),
      endName);
    // 如果是文件
   } else if (fileArray[i].isFile()) {
    // 如果是以“”结尾的文件
    if (fileArray[i].getName().endsWith(endName)) {
     // 展示文件
     System.out.println("exe文件: "
       + fileArray[i].getAbsolutePath());
     // 所有以“”结尾的文件相加
     textCount++;
    }
   }
  }
  return textCount;

 }

 /**
  * 在本文件夹下查找
  *
  * @param s
  *            String 文件名
  * @return File[] 找到的文件
  */
 public static File[] getFiles(String s) {
  return getFiles("./", s);
 }

 /**
  * 获取文件 可以根据正则表达式查找
  *
  * @param dir
  *            String 文件夹名称
  * @param s
  *            String 查找文件名,可带*.?进行模糊查询
  * @return File[] 找到的文件
  */
 public static File[] getFiles(String dir, String s) {
  // 开始的文件夹
  File file = new File(dir);
  s = s.replace('.', '#');
  s = s.replaceAll("#", ".");
  s = s.replace('*', '#');
  s = s.replaceAll("#", ".*");
  s = s.replace('?', '#');
  s = s.replaceAll("#", ".?");
  s = "^" + s + "$";

  Pattern p = Pattern.compile(s);
  ArrayList list = filePattern(file, p);
  File[] rtn = new File[list.size()];
  list.toArray(rtn);
  return rtn;
 }

 /**
  * @param file 起始文件夹路径
  * @param Pattern 匹配类型
  * @return ArrayList 其文件夹下的文件夹
  */
 private static ArrayList filePattern(File file, Pattern p) {
  //判断传进来的路径是否为null
  if (file == null) {
   return null;
  } else if (file.isFile()) {    //测试此抽象路径名表示的文件是否是一个标准文件
   Matcher fMatcher = p.matcher(file.getName()); //p.matcher(file.getName())编译给定正则表达式,并尝试将给定输入与其匹配
   if (fMatcher.matches()) {   //尝试将整个区域与模式匹配
    ArrayList list = new ArrayList();
    list.add(file);
    return list;
   }
  } else if (file.isDirectory()) {  //测试此抽象路径名表示的文件是否是一个目录
   File[] files = file.listFiles(); //获取此目录下文件的绝对路径,并返回一个数组
   if (files != null && files.length >= 0) {
    ArrayList list = new ArrayList();
    for (int i = 0; i < files.length; i++) {
     ArrayList rlist = filePattern(files[i], p);  //递归调用,查看所有文件夹下面的文件
     if (rlist != null) {
      list.addAll(rlist);
     }
    }
    return list;
   }
  }
  return null;
 }
 
 /**
  * 获取数组里的最大值
  * @param filenames
  * @return
  */
 private long findMaxNumber(String[] filenames){
  String max=filenames[0];
  int temp;
  for (int i = 1; i < filenames.length; i++) {
   temp=filenames[i].compareTo(max);
   if (temp>0) {
    max=filenames[i];
   }
  }
  return Long.parseLong(max);
 }

 /**
  * 检查磁盘上是否已经存在此文件,存在三种情况:
  * 1:如果不存在,返回预定义的名称
  * 2:如果存在一个名称相同的文件,返回与预定义的名称+当前日期+001
  * 3:如果存在多个前缀名相同的文件,则返回比最新的文件大一个编号的文件名称
  * @param filePath 文件的目录
  * @param fileName 预定义的文件名称
  * @return 最终的文件名称
  */
 public String checkFileCount(String filePath, String fileName) {
  // 获取xxx目录下所有的.JPG类型文件名称(大写)
  File[] files = FileDirectorySearch.getFiles(filePath, fileName+ "*.jpg");
  //获取文件个数
  int count=files.length;
  
  //如果没有这个文件,直接返回文件名称
  if (count==0) {
   return fileName;
  }else if (count==1) {
   //获取当前日期
   Date date =new Date();
   //格式化日期格式
   DateFormat dateformat=new SimpleDateFormat("yyyyMMdd");
   String riqi=dateformat.format(date);
   riqi+="001";
   //生成新的文件名称
   fileName+=riqi;
   return fileName;
  }else{
   //定义一个字符串数组,来接收字符串截取后的值
   String[] filenames = new String[count];
   //定义截取字符串的开始位置和结束位置和fileName的长度
   int beginIndex,endIndex,fileNameLength;
   for (int i = 0; i < files.length; i++) {
    filenames[i]=files[i].toString();
    System.out.println(filenames[i]+"  ");

    //获取文件名称第一次出现的位置
    beginIndex=filenames[i].indexOf(fileName);
    //获取文件名称第一次出现".jpg"的位置
    endIndex=filenames[i].indexOf(".jpg");
    //获取文件的名称的长度
    fileNameLength=fileName.length();
    //截取字符串
    filenames[i]=filenames[i].substring(beginIndex+fileNameLength, endIndex);
   }
   //获取最新的编号,并且加1,如原先名称为"我爱你20101225",则新的编号为"我爱你20101226",保证不会和原先的文件名重复
   long maxNumber= this.findMaxNumber(filenames);
   maxNumber++;
   //生成新的文件名称
   fileName+=maxNumber;
   return fileName;
  }
 }
 
 public static void main(String[] args) {
  //可在此初始化路径和文件名称,以便测试
  String fName = "美女";
  String fPath = "G:/图片素材/MM";
  FileDirectorySearch star = new FileDirectorySearch();
  System.out.println(star.checkFileCount(fPath, fName));
 }
}

===================代码结束======================
       注:本文部分内容借鉴自网络,感谢原作者的无私奉献。此段代码仅限于在特定的环境中正常运行,名称要有一定的命名规则,截取的编号部分只能是数字且尽量不要以0开头,否则会改变名称的长度(如不在乎长度的变化,可忽略此处),如:存在编号为A,A0001的文件,返回的新名称会是A2,而不是A0002。另本段代码仍有许多不完善之处,欢迎朋友们提出好的解决方案,不胜感激~!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值