獲取指定路徑下指定類型的文件名稱,並返回可用的新名稱
阿新 • • 發佈:2018-08-06
開頭 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。另本段代碼仍有許多不完善之處,歡迎朋友們提出好的解決方案,不勝感激~!
獲取指定路徑下指定類型的文件名稱,並返回可用的新名稱