获取指定路径下指定类型的文件名称,并返回可用的新名称

检查磁盘上指定目录是否已经存在同名文件(本代码是检查.jpg文件类型),存在三种情况:

1:不存在,返回查询的名称
    如:输入abc,返回abc
2:存在一个名称相同的文件,返回“预定义的名称+当前日期+001”的新名称
    如:存在一个叫abc.jpg的文件,输入abc,返回abc20101227001
3:存在多个前缀名相同的文件,则返回比编号最大的文件大一个编号的名称
    如:存在abc.jpg,abc20101227001,abc20101227002,…,abc201012270023的文件,输入abc,
返回abc20101227024

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

import java.io.File;
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 {
        private List list=new ArrayList();
        /**
         * 获取指定目录下的所有目录
         *
         * @param allList
         *            指定目录
         * @param endName
         *            指定以""结尾的文件
         * @return 得到的文件数目
         */
        public List findAllFileName(File allList) {
                // 创建fileArray名字的数组
                File[] fileArray = allList.listFiles();
                // 如果传进来一个以文件作为对象的allList 返回0
                if (null == fileArray) {
                        return null;
                }
                // 偏历目录下的文件
                for (int i = 0; i < fileArray.length; i++) {
                        // 如果是个目录
                        if (fileArray[i].isDirectory()) {
                                System.out.println("目录: "+fileArray[i].getAbsolutePath());
                                list.add(fileArray[i].getAbsolutePath());
                                // 递归调用
                                findAllFileName(fileArray[i].getAbsoluteFile());
                        }
                }
                return list;
        }
         /**
            * 创建查询指定目录下文件的方法
            *
            * @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()) {    //测试此抽象路径名表示的文件是否是一个标准文件
             //p.matcher(file.getName())编译给定正则表达式,并尝试将给定输入与其匹配
             Matcher fMatcher = 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 预定义的文件名称
            * @param fileType fileType文件类型名称
            * @return 最终的文件名称
            */
         public String checkFileCount(String filePath, String fileName,String fileType) {
            // 获取xxx目录下所有的指定类型文件名称(大写,要带上.)
            File[] files = FileDirectorySearch.getFiles(filePath, fileName+fileType);
            //获取文件个数
            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);
             //获取文件名称第一次出现指定文件类型的位置
                endIndex=filenames[i].indexOf(fileType);
                //获取文件的名称的长度
                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 = "C:/Users/sjhnsm/Pictures";
            FileDirectorySearch fds = new FileDirectorySearch();
            //1
            System.out.println("返回新文件的名称: "+fds.checkFileCount(fPath, fName,".jpg"));
            System.out.println("=================================================");
            //2
            fds.getDirAllfileNames(fPath);
            System.out.println("=================================================");
            //3
            File path = new File(fPath);
            int count = fds.findTxtFileCount(path, ".jpg");
            System.out.println(count);
            System.out.println("=================================================");
            //4
            fds.findAllFileName(path);
         }
}

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

原文地址:http://blog.51cto.com/1197822/2155403

时间: 2024-10-20 12:54:14

获取指定路径下指定类型的文件名称,并返回可用的新名称的相关文章

访问指定路径下的目录以及文件

#include "stdafx.h" //vs2010下运行通过 #undef UNICODE #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <iostream> using namespace std; void browseFile(char* path) { char pattern[FILENAME_MAX + 1]; sprintf(p

删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件

1 @echo off 2 ::删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. 3 ::本例需要Win2003/Vista/Win7系统自带的forfiles命令的支持 4 rem 指定待删除文件的存放路径 5 set SrcDir=D:\ajaxtrain\web 6 rem 指定天数 7 set DaysAgo=0 8 rem 要删除的文件通配 9 set searchmast=*.html 10 set filename=D:\ajaxtrain\web\deletefil

在HDFS上删除某个路径下特定类型的文件,比如class类型文件,比如txt类型文件

1.先获取连接: public class Utils { public static FileSystem HDFS() throws Exception{ Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://potter2:9000"); System.setProperty("HADOOP_USER_NAME", "potter&quo

获取指定路径下特定后缀的文件

# 获取指定路径下所有指定后缀的文件# dir 指定路径# ext 指定后缀,链表&不需要带点 或者不指定.例子:['xml', 'java']import osdef GetFileFromThisRootDir(dir,ext = None): allfiles = [] needExtFilter = (ext != None) for root,dirs,files in os.walk(dir): for filespath in files: filepath = os.path.j

Java获取一个路径下指定后缀名的所有文件

方法一: http://blog.csdn.net/zjx102938/article/details/8114114 import java.io.File; import java.util.ArrayList; import java.util.List; public class FileFind { public static void main(String[] args) { String path = "D:\\Test"; List data=new ArrayLis

Excel Macro宏 - 指定路径下两个TXT文件Copy后,导入Excel中并进行对比

由于Excel格式粘贴没时间,只写关键的VBA代码和TXT文档Format示例‘ Attribute VB_Name = "CopyAndDiffer" '2015/06/24 ADD By MAOUIZAYOI Option Explicit ' Excute Interface.Sub CopyAndDiffer() ' define variables    Dim ccnSht As Object       'ccnSht is named for current conso

删除指定路径下固定格式,以.log结尾、三天前的文件,或删除空的日志文件

师出‘百测’besttest 删除指定路径下固定格式,以.log结尾.三天前的文件,或删除空的日志文件. 日志文件格式:XXXX_2019-01-01.log. import os,datetime #判断文件是否为空,如果为空则删除 def del_file(file): with open(file,encoding='utf-8') as f: if f.read(): pass else: f.close() os.remove(file) #查找指定路径下xx结尾的文件 def sea

C#遍历指定路径下的文件夹

通过指定路径访问路径下的文件,在C#的开发中主要利用了Directory类和DirectoryInfo类,简要介绍Directory类中的成员:命名空间 System.IO 命名空间 1.CreateDirectory,已重载,用于创建指定路径下的所有目录: 2.Delete,删除指定目录: 3.Exists,确定给定目录是否引用磁盘现有目录:说白点就是判断路径是否存在: 4.GetCreationTime,获取目录的创建时间和日期: 4.GetCurrentDirectory,获取应用程序的当

JAVA之File类-将指定目录下的所有java文件的绝对路径存储到文本文件中

/* * 将指定目录下的所有java文件的绝对路径存储到文本文件中 * 建立一个java列表. * 思路: * 1.对指定目录进行递归 * 2.获取递归过程所有的java文件的路径 * 3.将这些路径存储在集合中 * 4.将集合中的内容写到文本文件 * 注:3,4步骤也可以合并成一个步骤 */ package ioTest.io3; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; imp