[Java] 하위 폴더 파일 목록 가져오기
May 15, 2024
어떤 디렉토리 아래에 있는 모든 파일/폴더들을 가져오는 방법에 대해서 알아보겠습니다.
1. File을 이용하여 하위 파일 리스트 가져오기
File과 재귀함수를 이용하여 아래와 같이 디렉토리 하위 파일들을 모두 출력할 수 있습니다.
File.listFiles()
: 파일이 디렉토리라면, 바로 아래 경로에 있는 모든 파일 리스트를 File 배열로 리턴printFileList(file)
: file이 디렉토리라면, 하위 경로의 파일 목록을 출력하기 위해 재귀함수 호출
import java.io.File;
public class Example {
public static void main(String[] args) {
String path = "/home/test/my_project";
File directory = new File(path);
printFileList(directory);
}
public static void printFileList(File directory) {
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
// 파일인 경우 파일 이름 출력
System.out.println("File: " + file.getName());
} else if (file.isDirectory()) {
// 디렉터리인 경우 디렉터리 이름 출력 후 재귀 호출
System.out.println("Directory: " + file.getName());
printFileList(file);
}
}
}
}
}
Output:
File: README.md
Directory: java
Directory: DoublyLinkedList
File: MyLinkedList.java
Directory: SinglyLinkedList
File: MyLinkedList.java
Directory: LinkedList
File: DoublyLinkedList.cpp
File: CircularLinkedList.cpp
File: SinglyLinkedList.cpp
2. Path와 Files를 이용하여 하위 파일 리스트 가져오기
Java 7에서 추가된 Path와 Files를 이용하면 더 간단히 하위 파일, 폴더 리스트를 가져올 수 있습니다.
Files.walkFileTree()
는 인자로 전달된 디렉토리의 하위 모든 파일/폴더에 대해서 탐색하며 콜백으로 Path 객체를 받을 수 있습니다. Path를 통해 File 객체를 얻을 수도 있습니다.
visitFile()
: 하위 경로를 탐색하면서 발견된 파일이 인자로 전달됨preVisitDirectory()
: 하위 경로를 탐색하면서 발견된 디렉토리가 인자로 전달됨- 가장 상위 디렉토리(예제에서
"/home/test/my_project"
)도preVisitDirectory()
으로 전달됨
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;
public class Example {
public static void main(String[] args) throws IOException {
String path = "/home/test/my_project";
Path directory = Paths.get(path);
Files.walkFileTree(directory, EnumSet.noneOf(FileVisitOption.class),
Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println("File: " + file.getFileName());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
System.out.println("Directory: " + dir.getFileName());
return FileVisitResult.CONTINUE;
}
});
}
}
Output:
Directory: my_project
File: README.md
Directory: java
Directory: DoublyLinkedList
File: MyLinkedList.java
Directory: SinglyLinkedList
File: MyLinkedList.java
Directory: LinkedList
File: DoublyLinkedList.cpp
File: CircularLinkedList.cpp
File: SinglyLinkedList.cpp