Java thư mụctừđệ quyTìm kiếm tệp
Java Tiếp theo, tôi sẽ giới thiệu một chương trình mẫu thực hiện tìm kiếm đệ quy các tệp trong một thư mục được chỉ định, bao gồm cả các thư mục con của nó, và truy xuất danh sách các tệp phù hợp với tiêu chí tìm kiếm.
Các lệnh này thực hiện các thao tác tương tự như lệnh `ls -R` của UNIX và lệnh `dir /s` của Windows.
Ngoài ra, bạn có thể chỉ định ký tự đại diện * trong tên tệp cần tìm kiếm hoặc sử dụng biểu thức chính quy để tìm kiếm.
Ví dụ về cách sử dụng, trong trường hợp sau, thư mục `filelist` được tìm kiếm đệ quy, bao gồm cả các thư mục con của nó, và thu được một danh sách các tệp có phần mở rộng `.java`.
File[] files = search.listFiles(“C:/filelist/”, “*.java”);
Chương trình mẫu
/**
*
*/
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;
/**
* Từ thư mục được chỉ định [directoryPath],
* Tìm kiếm đệ quy tệp mục tiêu [fileName] và tìm tệp phù hợp
* Trả về một danh sách các đối tượng tệp.
*
* ví dụ)
* File[] files =listFiles(“C:/filelist/”, “*.java”);
* Trong ví dụ trên, danh sách tệp trong thư mục được tìm kiếm đệ quy.
* Truy xuất danh sách các tệp có phần mở rộng .java.
*
* @param directoryPath Đường dẫn đại diện cho thư mục cần tìm kiếm.
* @param fileName Tên tệp tin cần tìm kiếm
* Bạn có thể chỉ định dấu * làm ký tự đại diện trong tên tệp.
* @return Đối tượng tệp khớp với tìm kiếm
*/
public File[] listFiles(String directoryPath, String fileName) {
// Chuyển đổi ký tự đại diện * thành biểu thức chính quy
nếu (fileName != null) {
fileName = fileName.replace(“.”, “\\.”);
fileName = fileName.replace(“*”, “.*”);
}
return listFiles(directoryPath, fileName, TYPE_FILE, true, 0);
}
/**
* Từ thư mục được chỉ định [directoryPath], biểu thức chính quy được chỉ định
* Tìm kiếm đệ quy tệp mục tiêu [fileNamePattern],
* Trả về danh sách các đối tượng tệp phù hợp.
*
* Ngoài ra, bạn có thể tìm kiếm bằng cách kiểm tra xem ngày sửa đổi của tệp có vượt quá số ngày được chỉ định kể từ ngày sửa đổi ban đầu hay không.
* Bạn có thể chỉ định điều này.
*
* ví dụ)
* File[] files =
* listFiles(“C:/filelist/”, “*.java”,TYPE_FILE, true, 2);
* Trong ví dụ trên, danh sách tệp trong thư mục được tìm kiếm đệ quy và cập nhật để chỉ hiển thị những tệp được cập nhật cách đây 7 ngày trở lên.
* Truy xuất danh sách các tệp có phần mở rộng .java.
*
* @param directoryPath Đường dẫn đại diện cho thư mục cần tìm kiếm.
* @param fileNamePattern Tên tệp cần tìm kiếm [biểu thức chính quy]
* @param type Đối tượng tệp tương ứng được xác định bởi [type],
* Các tùy chọn sau đây có sẵn:
* TYPE_FILE_OR_DIR... Tệp và thư mục
* TYPE_FILE... Tệp
* TYPE_DIR...Thư mục
* @param isRecursive: đặt thành true nếu bạn muốn tìm kiếm đệ quy.
* @param period Mục tiêu tìm kiếm là các tệp có ngày sửa đổi đã quá một số ngày nhất định.
* Bạn có thể tùy chỉnh bật hoặc tắt tính năng này.
* Nếu bằng 0, nghĩa là không áp dụng.
* Nếu số này lớn hơn hoặc bằng 1, các tệp tin từ số ngày được chỉ định trở đi sẽ được đưa vào tìm kiếm.
* Nếu giá trị là -1 hoặc nhỏ hơn, các tệp tin cũ hơn số ngày được chỉ định sẽ được đưa vào tìm kiếm.
* @return Đối tượng tệp khớp với tìm kiếm
*/
public File[] listFiles(String directoryPath,
Chuỗi fileNamePattern, kiểu int,
boolean isRecursive, int period) {
File dir = new File(directoryPath);
nếu (!dir.isDirectory()) {
ném ngoại lệ IllegalArgumentException mới.
(Đường dẫn được chỉ định bởi đối số [" + dir.getAbsolutePath() +
“"] không phải là thư mục.");
}
File[] files = dir.listFiles();
// Kết quả đầu ra đó
for (int i = 0; i < files.length; i++) {
Filefile = files[i];
addFile(type, fileNamePattern, set, file, period);
// Tìm kiếm đệ quy và, nếu đó là thư mục, hãy thêm nó vào danh sách một cách đệ quy.
nếu (isRecursive && file.isDirectory()) {
listFiles(file.getAbsolutePath(), fileNamePattern,
kiểu, isRecursive, period);
}
}
return (File[]) set.toArray(new File[set.size()]);
}
private void addFile(int type, String match, TreeSet set,
Tệp tin, chu kỳ int) {
công tắc (loại) {
trường hợp TYPE_FILE:
nếu (!file.isFile()) {
trở lại;
}
phá vỡ;
trường hợp TYPE_DIR:
nếu (!file.isDirectory()) {
trở lại;
}
phá vỡ;
}
nếu (match != null && !file.getName().matches(match)) {
trở lại;
}
// Nếu có yêu cầu kiểm tra xem một số ngày nhất định đã trôi qua hay chưa.
nếu (chu kỳ != 0) {
// Ngày sửa đổi tệp
Date lastModifiedDate = new Date(file.lastModified());
String lastModifiedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(lastModifiedDate);
// Ngày được chỉ định (một ngày được tính bằng mili giây)
long oneDayTime = 24L * 60L * 60L * 1000L;
long periodTime = oneDayTime * Math.abs(period);
Ngày thiết kế =
new Date(System.currentTimeMillis() – periodTime);
String designatedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(designatedDate);
nếu (chu kỳ > 0) {
nếu (lastModifiedDateStr.compareTo(designatedDateStr) < 0) {
trở lại;
}
khác {
nếu (lastModifiedDateStr.compareTo(designatedDateStr) > 0) {
trở lại;
}
}
}
// Lưu vào danh sách nếu tất cả các điều kiện được đáp ứng
set.add(file);
}
/** Sử dụng TreeSet để sắp xếp theo thứ tự bảng chữ cái. */
private TreeSet set = new TreeSet();
/**
* Nếu bạn muốn sử dụng lại đối tượng sau khi đã tạo, hãy sử dụng phương pháp này.
* Cuộc gọi cần được kết thúc.
* ví dụ)
* 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();
}
}
Kết quả thực thi
Để kiểm tra chương trình mẫu, tôi đã tạo một thư mục có tên là `filelist` và chuẩn bị các tệp sau.
Tên tệp và ngày sửa đổi được hiển thị.
*Lưu ý rằng ngày hiện tại là2007/08/18Giả sử đó là trường hợp đúng.
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/16
◆Ví dụ
System.out.println("\n●Lấy tất cả các tập tin");
File[] files = search.listFiles(path, null);
printFileList(files);
search.clear();
System.out.println("\n●Lấy các tệp có phần mở rộng .java");
files = search.listFiles(path, “*.java”);
printFileList(files);
search.clear();
System.out.println("\n●Lấy tất cả các tệp và thư mục");
files = search.listFiles(path, null,search.TYPE_FILE_OR_DIR, true, 0);
printFileList(files);
search.clear();
System.out.println("\n●Lấy các tệp đã được cập nhật cách đây hai ngày trở lên so với ngày hiện tại");
files = search.listFiles(path, null,search.TYPE_FILE, true, 2);
printFileList(files);
search.clear();
System.out.println("\n●Lấy các tập tin cũ hơn từ 30 ngày trước trở về trước so với ngày hiện tại");
files = search.listFiles(path, null,search.TYPE_FILE, true, -30);
printFileList(files);
search.clear();
}
private static void printFileList(File[] files) {
for (int i = 0; i < files.length; i++) {
Filefile = files[i];
System.out.println((i + 1) + “: ” + file);
}
}
◆Kết quả đầu ra
●Lấy tất cả các tệp 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 ●Lấy các tệp có phần mở rộng .java 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java ●Lấy tất cả các tệp và thư mục 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 ●Lấy các tệp được cập nhật từ ngày hiện tại, bắt đầu từ 2 ngày trước 1: 1: 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ddd.java 4: C:\filelist\dir\eee.jpg ●Lấy các tệp cũ hơn từ 30 ngày trước trở về trước tính từ ngày hiện tại 1: C:\filelist\dir\ccc.java
