完整工具方法
public static boolean deleteDir(File dir) {
if (dir == null || !dir.exists()) return true;
if (dir.isFile()) return dir.delete();
File[] files = dir.listFiles();
if (files != null) {
// 倒序刪除:先刪子文件/子目錄,最後刪自身
for (int i = files.length - 1; i >= 0; i--) {
deleteDir(files[i]);
}
}
return dir.delete(); // 空目錄才能刪除成功
}
調用示例
File videoDir = new File(Environment.getExternalStorageDirectory(), "MyApp/Videos");
deleteDir(videoDir);
關鍵點
- 倒序遍歷:避免刪除前項導致數組索引偏移(雖然 `listFiles()` 返回快照,但習慣更安全)。
- 遞歸刪除子目錄:`File.delete()` 僅能刪除空目錄。
- 權限:Android 10+ 需 `MANAGE_EXTERNAL_STORAGE` 或使用 `MediaStore` API 刪除媒體文件。
現代替代:Kotlin 協程 + File 扩展
suspend fun File.deleteRecursively(): Boolean = withContext(Dispatchers.IO) {
if (!exists()) return@withContext true
if (isFile) return@withContext delete()
listFiles()?.forEach { it.deleteRecursively() }
delete()
}