Java 目錄從遞迴搜尋文件
Java 接下來,我將介紹一個範例程序,該程序遞歸地搜尋指定目錄(包括其子目錄)中的文件,並檢索符合搜尋條件的文件清單。
這些指令執行的操作與 UNIX 指令 `ls -R` 和 Windows 指令 `dir /s` 相同。
此外,您也可以在要搜尋的檔案名稱中指定 * 作為通配符,或使用正規表示式進行搜尋。
例如,在下列範例中,將遞歸搜尋目錄“filelist”,包括其子目錄,並取得副檔名為“.java”的檔案清單。
File[] files = search.listFiles(“C:/filelist/”, “*.java”);
範例程式
/**
*
*/
public class FileSearch {
public static final int TYPE_FILE_OR_DIR = 1;
public static final int TYPE_FILE = 2;
public static final int TYPE_DIR = 3;
/**
* 從指定的目錄 [directoryPath] 中,
* 遞歸搜尋目標檔案 [fileName] 並找到匹配項
* 傳回文件物件清單。
*
* 例)
* File[] files = listFiles(“C:/filelist/”, “*.java”);
* 在上面的例子中,目錄檔案清單是遞歸搜尋的。
* 取得副檔名為 .java 的檔案清單。
*
* @param directoryPath 要搜尋的目錄路徑。
* @param fileName 要搜尋的檔名
*檔案名稱中可以使用萬用字元*。
* @return 傳回與搜尋條件相符的文件對象
*/
public File[] listFiles(String directoryPath, String fileName) {
// 將 * 作為通配符轉換為正規表示式
如果 (fileName != null) {
fileName = fileName.replace(“.”, “\\.”);
fileName = fileName.replace(“*”, “.*”);
}
回傳 listFiles(directoryPath, fileName, TYPE_FILE, true, 0);
}
/**
* 從指定的目錄 [directoryPath] 中,使用指定的正規表示式
* 遞歸搜尋目標檔案 [fileNamePattern],
* 傳回符合的文件物件清單。
*
此外,您還可以透過檢查文件的修改日期是否超過原始修改日期指定的天數來進行搜尋。
您可以指定這一點。
*
* 例)
* 文件[] files =
* listFiles(“C:/filelist/”, “*.java”,TYPE_FILE, true, 2);
* 在上面的範例中,目錄檔案清單是遞歸搜尋的,並且更新後只顯示 7 天前或之後更新的檔案。
* 取得副檔名為 .java 的檔案清單。
*
* @param directoryPath 要搜尋的目錄路徑。
* @param fileNamePattern 要搜尋的檔案名稱 [正規表示式]
* @param type 由 [type] 決定對應的文件對象,
* 可選擇以下方案:
* TYPE_FILE_OR_DIR... 檔案和目錄
* TYPE_FILE... 文件
* TYPE_DIR...目錄
* @param isRecursive: 如果要遞歸搜索,請設定為 true。
* @param period 搜尋目標是修改日期超過指定天數的檔案。
您可以設定是否啟用此功能。
* 如果為 0,則不適用。
* 如果該數字為 1 或更大,則搜尋範圍將包括指定天數之後的檔案。
* 如果值為 -1 或更小,則搜尋範圍將包括早於指定天數的檔案。
* @return 傳回與搜尋條件相符的文件對象
*/
public File[] listFiles(String directoryPath,
字串 fileNamePattern,整數型,,
boolean isRecursive, int period) {
File dir = new File(directoryPath);
如果 (!dir.isDirectory()) {
拋出新的 IllegalArgumentException
(參數指定的路徑 [" + dir.getAbsolutePath() +
“"] 不是一個目錄。");
}
File[] files = dir.listFiles();
// 該輸出
for (int i = 0; i < files.length; i++) {
文件檔 = files[i];
addFile(type, fileNamePattern, set, file, period);
// 遞歸搜索,如果是目錄,則遞歸地將其新增至清單。
如果 (isRecursive && file.isDirectory()) {
listFiles(file.getAbsolutePath(), fileNamePattern,
類型、是否遞歸、句號);;
}
}
return (File[]) set.toArray(new File[set.size()]);
}
private void addFile(int type, String match, TreeSet set,
文件 file,int period) {
開關(類型){
case TYPE_FILE:
如果 (!file.isFile()) {
返回;
}
休息;
case TYPE_DIR:
如果 (!file.isDirectory()) {
返回;
}
休息;
}
如果 (match != null && !file.getName().matches(match)) {
返回;
}
// 如果有一個規格來檢查是否已經過去了指定的天數。
如果(週期 != 0){
// 檔案修改日期
Date lastModifiedDate = new Date(file.lastModified());
String lastModifiedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(lastModifiedDate);
// 指定日期(一天以毫秒計算)
long oneDayTime = 24L * 60L * 60L * 1000L;
long periodTime = oneDayTime * Math.abs(period);
DateDesignDate =
new Date(System.currentTimeMillis() – periodTime);
String designatedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(指定日期);
如果(週期 > 0){
如果 (lastModifiedDateStr.compareTo(designatedDateStr) < 0) {
返回;
}
別的 {
如果 (lastModifiedDateStr.compareTo(designatedDateStr) > 0) {
返回;
}
}
}
// 如果所有條件都滿足,則將其儲存到清單中
set.add(file);
}
/** 使用 TreeSet 按字母順序排序。 */
private TreeSet set = new TreeSet();
/**
* 如果建立實例後想再次使用該實例,請使用此方法。
* 需要清除通話記錄。
* 例)
* FileSearch search = new FileSearch();
* File[] f1 = search.listFiles(C:/filelist/”, “*.java”);
* search.clear();
* File[] f2 = search.listFiles(“C:/filelist/”, “*.jsp”);
*/
public void clear(){
set.clear();
}
}
執行結果
為了驗證範例程序,我建立了一個名為 `filelist` 的目錄,並準備了以下檔案。
顯示檔案名稱和修改日期。
*請注意,目前日期為2007/08/18假設情況確實如此。
C:\filelist │ aaa.java 2007/08/18 │ bbb.java 2007/08/18 └─dir ccc.java 2007/07/17 ddd.java 2007/08/18 eee.jpg 2007/08
◆範例
System.out.println("\n●取得所有檔案");
File[] files = search.listFiles(path, null);
printFileList(files);
搜尋.clear();
System.out.println("\n●取得副檔名為 .java 的檔案");
files = search.listFiles(path, “*.java”);
printFileList(files);
搜尋.clear();
System.out.println("\n●取得所有檔案和目錄");
files = search.listFiles(path, null, search.TYPE_FILE_OR_DIR, true, 0);
printFileList(files);
搜尋.clear();
System.out.println("\n●檢索距離目前日期兩天或更久以前更新的檔案");
files = search.listFiles(path, null, search.TYPE_FILE, true, 2);
printFileList(files);
搜尋.clear();
System.out.println("\n●檢索目前日期前30天或更早的檔案");
files = search.listFiles(path, null, search.TYPE_FILE, true, -30);
printFileList(files);
搜尋.clear();
}
private static void printFileList(File[] files) {
for (int i = 0; i < files.length; i++) {
文件檔 = files[i];
System.out.println((i + 1) + “: ” + file);
}
}
◆輸出結果
●取得所有檔案 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java 5: C:\filelist\dir\eee.jpg ●aaalist\dir\ddd.java 5: C:\filelist\dir\eee.jpg ●aaalist: 取得副檔名 4:202\2:2\2 124list: 取得副檔3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java ●取得所有檔案和目錄 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir 4: C:\filelist\ C:\filelist\dir\eee.jpg ●取得從今天開始更新的文件,從兩天前開始 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ddd.java 4: C:\filelist\dir\eee.jpg 130天或更早的日期(jp:30 C:\filelist\dir\ccc.java
