首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 刪除 SD 卡檔案/目錄:遞迴刪除與權限處理

     編輯:程式設計綜合問答

問題現象

file.delete() 僅能刪除單一檔案或空目錄,非空目錄刪除失敗回傳 false,需遞迴刪除子檔案/子目錄。

標準遞迴刪除工具方法


public static boolean deleteRecursively(File fileOrDirectory) {
    if (fileOrDirectory == null || !fileOrDirectory.exists()) return true;
    
    if (fileOrDirectory.isDirectory()) {
        File[] children = fileOrDirectory.listFiles();
        if (children != null) {
            for (File child : children) {
                if (!deleteRecursively(child)) return false;
            }
        }
    }
    return fileOrDirectory.delete();  // 刪除空目錄或檔案
}

完整權限與執行緒處理


public void deleteSdCardFolder(String path) {
    // 1. 檢查權限 (Android 10+ 範圍儲存需 MediaStore 或 SAF)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        // 建議使用 MediaStore API 或 Storage Access Framework
        // 此處僅示範傳統方式
    }
    
    // 2. 背景執行緒執行(避免 ANR)
    Executors.newSingleThreadExecutor().execute(() -> {
        File dir = new File(path);
        boolean success = deleteRecursively(dir);
        runOnUiThread(() -> Toast.makeText(this, 
            success ? "刪除成功" : "刪除失敗", Toast.LENGTH_SHORT).show());
    });
}

Android 版本差異與最佳實踐

版本儲存模型刪除方式
< Android 10 (Q)傳統檔案系統File.delete() + 權限 WRITE_EXTERNAL_STORAGE
Android 10 (Q)範圍儲存僅能刪除自建檔案;他建檔案需 MediaStore + 用戶確認
Android 11+ (R)強制範圍儲存同 Q,MANAGE_EXTERNAL_STORAGE 權限極難獲取

現代刪除方式(Android 10+)


// 刪除自建媒體檔案
ContentResolver resolver = getContentResolver();
Uri uri = MediaStore.Files.getContentUri("external");
String selection = MediaStore.MediaColumns.DATA + " LIKE ?";
String[] args = new String[] { path + "%" };
int deleted = resolver.delete(uri, selection, args);

關鍵提醒

  • 遞迴刪除必須先刪子項:目錄非空無法直接刪除。
  • 檢查 listFiles() 回傳 null:權限不足或非目錄時回傳 null,需防禦性判斷。
  • 耗時操作放背景執行緒:大量檔案刪除易導致主執行緒卡頓。
  • Android 10+ 必須適配範圍儲存:傳統 File API 逐步受限,拥抱 MediaStore/StorageManager/SAF。

檔案刪除看似簡單,實則涉及權限模型演進、執行緒調度、遞迴邏輯正確性,需根據目標 API 級別選擇正確方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved