ชวา ไดเร็กทอรีจากเรียกซ้ำค้นหาไฟล์
ชวา ต่อไปนี้ ผมจะนำเสนอโปรแกรมตัวอย่างที่ค้นหาไฟล์ในไดเร็กทอรีที่ระบุแบบวนซ้ำ รวมถึงไดเร็กทอรีย่อย และดึงรายการไฟล์ที่ตรงกับเกณฑ์การค้นหาออกมา
คำสั่งเหล่านี้ทำหน้าที่เหมือนกับคำสั่ง `ls -R` ในระบบ UNIX และคำสั่ง `dir /s` ในระบบ Windows
นอกจากนี้ คุณสามารถระบุ * เป็นอักขระตัวแทนในชื่อไฟล์ที่ต้องการค้นหา หรือใช้ regular expression ในการค้นหาได้
ตัวอย่างการใช้งาน ในกรณีต่อไปนี้ จะทำการค้นหาในไดเร็กทอรี `filelist` แบบวนซ้ำ รวมถึงไดเร็กทอรีย่อย และจะได้รายการไฟล์ที่มีนามสกุล `.java`
ไฟล์[] ไฟล์ = search.listFiles(“C:/filelist/”, “*.java”);
ตัวอย่างโปรแกรม
/**
*
*/
คลาสสาธารณะ 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] แบบวนซ้ำและหาไฟล์ที่ตรงกัน
* ส่งคืนรายการของอ็อบเจ็กต์ไฟล์
*
* ตัวอย่าง)
* ไฟล์[] files =listFiles(“C:/filelist/”, “*.java”);
* ในตัวอย่างข้างต้น การค้นหารายการไฟล์ในไดเร็กทอรีจะดำเนินการแบบเรียกซ้ำ
* ดึงรายการไฟล์ที่มีนามสกุล .java
*
* @param directoryPath เส้นทางที่แสดงถึงไดเร็กทอรีที่จะค้นหา
* @param fileName ชื่อไฟล์ที่ต้องการค้นหา
* สามารถใช้ตัวอักษรตัวแทน (wildcard characters) * ในชื่อไฟล์ได้
* @return อ็อบเจ็กต์ไฟล์ที่ตรงกับการค้นหา
*/
public File[] listFiles(String directoryPath, String fileName) {
// แปลง * ซึ่งเป็นอักขระตัวแทน (wildcard) ให้เป็นนิพจน์ปกติ (regular expression)
ถ้า (fileName != null) {
fileName = fileName.replace(“.”, “\\.”);
fileName = fileName.replace(“*”, “.*”);
}
คืนค่า listFiles(directoryPath, fileName, TYPE_FILE, true, 0);
}
/**
* จากไดเร็กทอรีที่ระบุ [directoryPath] นิพจน์ปกติที่ระบุ
* ค้นหาไฟล์เป้าหมาย [fileNamePattern] แบบวนซ้ำ
* ส่งคืนรายการของอ็อบเจ็กต์ไฟล์ที่ตรงกัน
*
* นอกจากนี้ คุณสามารถค้นหาโดยตรวจสอบว่าวันที่แก้ไขไฟล์นั้นเกินกว่าจำนวนวันที่ระบุไว้หลังจากวันที่แก้ไขครั้งแรกหรือไม่
* คุณสามารถระบุสิ่งนี้ได้
*
* ตัวอย่าง)
* ไฟล์[] ไฟล์ =
* 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,
รูปแบบชื่อไฟล์สตริง, ประเภท int,
boolean isRecursive, int period) {
File dir = new File(directoryPath);
ถ้า dir.isDirectory() {
โยนข้อยกเว้นอาร์กิวเมนต์ที่ไม่ถูกต้องใหม่
(เส้นทางที่ระบุโดยอาร์กิวเมนต์ [" + dir.getAbsolutePath() +
“"ไม่ใช่สารบบ");
}
ไฟล์[] ไฟล์ = dir.listFiles();
// ผลลัพธ์นั้น
for (int i = 0; i < files.length; i++) {
ไฟล์ไฟล์ = ไฟล์[i];
addFile(type, fileNamePattern, set, file, period);
// ค้นหาแบบวนซ้ำ และหากเป็นไดเร็กทอรี ให้เพิ่มลงในรายการแบบวนซ้ำ
ถ้า (isRecursive && file.isDirectory()) {
listFiles(file.getAbsolutePath(), fileNamePattern,
ประเภท, เรียกซ้ำ, ช่วงเวลา);
}
}
คืนค่า (File[]) set.toArray(new File[set.size()]);
}
private void addFile(int type, String match, TreeSet set,
ไฟล์ ไฟล์, จำนวนเต็ม) {
สวิตช์ (ประเภท) {
กรณี TYPE_FILE:
ถ้าไฟล์ไม่ใช่ไฟล์ {
กลับ;
}
หยุดพัก;
กรณี TYPE_DIR:
ถ้าไฟล์ไม่ใช่ไดเร็กทอรี {
กลับ;
}
หยุดพัก;
}
ถ้า (match != null && !file.getName().matches(match)) {
กลับ;
}
// หากมีข้อกำหนดให้ตรวจสอบว่าจำนวนวันที่ระบุได้ผ่านไปแล้วหรือไม่
ถ้า (period != 0) {
// วันที่แก้ไขไฟล์
Date lastModifiedDate = new Date(file.lastModified());
String lastModifiedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(lastModifiedDate);
// วันที่ที่ระบุ (หนึ่งวันคำนวณเป็นมิลลิวินาที)
long oneDayTime = 24L * 60L * 60L * 1000L;
ระยะเวลาที่ยาวนาน = ระยะเวลาหนึ่งวัน * ค่าสัมบูรณ์ของระยะเวลา;
วันที่ออกแบบ =
วันที่ใหม่ (System.currentTimeMillis() – periodTime);
String designatedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(designatedDate);
ถ้า (period > 0) {
ถ้า (lastModifiedDateStr.compareTo(designatedDateStr) < 0) {
กลับ;
}
อื่น {
ถ้า (lastModifiedDateStr.compareTo(designatedDateStr) > 0) {
กลับ;
}
}
}
// บันทึกลงในลิสต์หากตรงตามเงื่อนไขทั้งหมด
ตั้งค่าเพิ่มไฟล์;
}
/** ใช้ TreeSet เพื่อเรียงลำดับตามตัวอักษร */
private TreeSet set = new TreeSet();
/**
* หากคุณต้องการใช้งานอินสแตนซ์อีกครั้งหลังจากสร้างแล้ว ให้ใช้วิธีนี้
* ต้องวางสายก่อน
* ตัวอย่าง)
* FileSearch search = new FileSearch();
* ไฟล์[] f1 = search.listFiles(C:/filelist/”, “*.java”);
* ค้นหา.ล้าง();
* ไฟล์[] f2 = search.listFiles(“C:/filelist/”, “*.jsp”);
*/
public void clear(){
ตั้งค่า.เคลียร์();
}
}
ผลลัพธ์การดำเนินการ
เพื่อตรวจสอบโปรแกรมตัวอย่าง ฉันได้สร้างไดเร็กทอรีชื่อ `filelist` และเตรียมไฟล์ต่อไปนี้ไว้
ชื่อไฟล์และวันที่แก้ไขจะแสดงขึ้น
*โปรดทราบว่าวันที่ปัจจุบันคือ2007/08/18สมมติว่าเป็นเช่นนั้นก็แล้วกัน
C:\filelist │ aaa.java 2550/08/18 │ bbb.java 2550/08/18 └─dir ccc.java 2550/07/17 ddd.java 2550/08/18 eee.jpg 2007/08/16
◆ตัวอย่าง
System.out.println("\n●รับไฟล์ทั้งหมด");
ไฟล์[] files = search.listFiles(path, null);
printFileList(ไฟล์);
ค้นหา.ล้าง();
System.out.println("\n●รับไฟล์ที่มีนามสกุล .java");
files = search.listFiles(path, “*.java”);
printFileList(ไฟล์);
ค้นหา.ล้าง();
System.out.println("\n●รับไฟล์และไดเร็กทอรีทั้งหมด");
files = search.listFiles(path, null,search.TYPE_FILE_OR_DIR, true, 0);
printFileList(ไฟล์);
ค้นหา.ล้าง();
System.out.println("\n●ดึงไฟล์ที่ได้รับการอัปเดตเมื่อสองวันก่อนหรือมากกว่านั้นนับจากวันที่ปัจจุบัน");
files = search.listFiles(path, null, search.TYPE_FILE, true, 2);
printFileList(ไฟล์);
ค้นหา.ล้าง();
System.out.println("\n●เรียกดูไฟล์เก่าจาก 30 วันที่แล้วหรือก่อนหน้าวันที่ปัจจุบัน");
files = search.listFiles(path, null,search.TYPE_FILE, true, -30);
printFileList(ไฟล์);
ค้นหา.ล้าง();
}
private static void printFileList(File[] files) {
for (int i = 0; i < files.length; i++) {
ไฟล์ไฟล์ = ไฟล์[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 ●ดึงไฟล์ที่มีนามสกุล .java 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 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\dir\ccc.java 5: C:\filelist\dir\ddd.java 6: C:\filelist\dir\eee.jpg ●ดึงไฟล์ที่ได้รับการอัปเดตจากเวอร์ชันปัจจุบัน วันที่ เริ่มต้นจาก 2 วันที่แล้ว 1: 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ddd.java 4: C:\filelist\dir\eee.jpg ●ดึงไฟล์เก่าจาก 30 วันที่แล้วหรือก่อนหน้าวันที่ปัจจุบัน 1: C:\filelist\dir\ccc.java
