1. 程式人生 > >獲取指定路徑下指定類型的文件名稱,並返回可用的新名稱

獲取指定路徑下指定類型的文件名稱,並返回可用的新名稱

開頭 size 匹配類型 param 根據 表達 輸入a void 方法

檢查磁盤上指定目錄是否已經存在同名文件(本代碼是檢查.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。另本段代碼仍有許多不完善之處,歡迎朋友們提出好的解決方案,不勝感激~!

獲取指定路徑下指定類型的文件名稱,並返回可用的新名稱