在 Java 開發中,處理檔案與目錄操作是常見需求。本文提供一個完整的 FileMove 工具類,示範如何遞歸移動指定資料夾內的所有檔案(包含子目錄)到目標路徑,並處理目標檔案已存在、目錄不存在自動建立等細節。
import java.io.File;
public class FileMove {
/**
* 移動指定資料夾內的全部檔案
*
* @param from 來源資料夾路徑
* @param to 目標資料夾路徑
* @throws Exception 移動過程中發生的異常
*/
public static void fileMove(String from, String to) throws Exception {
try {
File dir = new File(from);
// 取得檔案清單
File[] files = dir.listFiles();
if (files == null) return;
// 確保目標目錄存在
File moveDir = new File(to);
if (!moveDir.exists()) {
moveDir.mkdirs();
}
// 遍歷並移動每個檔案/目錄
for (int i = 0; i < files.length; i++) {
// 若為目錄,遞歸處理
if (files[i].isDirectory()) {
fileMove(files[i].getPath(), to + "\\" + files[i].getName());
// 移動成功後刪除原目錄
files[i].delete();
}
File moveFile = new File(moveDir.getPath() + "\\" + files[i].getName());
// 若目標已存在同名檔案,先刪除
if (moveFile.exists()) {
moveFile.delete();
}
// 執行移動(重命名)
files[i].renameTo(moveFile);
}
} catch (Exception e) {
throw e;
}
}
}
mkdirs() 確保多層路徑一次建立完成。renameTo 失敗。delete() 移除。public static void main(String[] args) {
try {
FileMove.fileMove("D:/source_folder", "D:/target_folder");
System.out.println("移動完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
renameTo 行為跨平台差異大,若需跨磁碟區移動,建議改用 Files.move (Java NIO.2) 並指定 StandardCopyOption.REPLACE_EXISTING。此範例展示了傳統 java.io.File API 實作資料夾遞歸移動的基本邏輯。現代專案建議改用 java.nio.file.Files 與 Path,功能更強大且跨平台相容性更好。