[英]Can't create new folders on SD card to backup many file
我正在嘗試備份目錄,但我一直無法創建新文件夾。
首先,我向 Manifest 授予權限並且已經請求了運行時權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE" />
注意:我設備上的Environment.getExternalStorageDirectory()
返回內部存儲而不是 SdCard。 但是,我使用文件選擇器從 SdCard 中選擇文件並正確讀取其數據。
但是,這是我備份目錄的方法:
private void backupSmaliDir(String smaliDir){
StringBuilder result = new StringBuilder("");
String backupDirPath = smaliDir+"-BACKUP";
StringBuffer listFile = getAllFiles(new File(smaliDir));
String[] lines = listFile.toString().split("\n");
result.append(String.format("BACKUP DIR: %s\nHAVE %s file to backup\n", backupDirPath, String.valueOf(lines.length)));
try {
for (String path : lines) {
File f = new File(path.replaceFirst(smaliDir, backupDirPath));
File newf = f.getParentFile();
result.append(String.format("\n Old: %s\n New: %s\n", path, newf.getCanonicalPath()+"/"+ new File(path).getName()));
boolean isCopied = false;
result.append(String.format("[w] EXISTS: %s | MKDIRS: %s\n", newf.exists(), newf.mkdirs()));
if (newf.exists() || newf.mkdirs()) {
// just copy path (FILE) to newf (FILE)
File fi = new File(path);
File fo = new File(newf.getCanonicalPath()+"/"+fi.getName());
copyFileUsingStream(fi, fo);
isCopied = true;
}
if (isCopied) result.append("\tCopied!\n");
else result.append("\tCanceled!\n");
}
} catch (IOException e) {
e.printStackTrace();
}
saveBackupLog(result.toString());
}
我不知道為什么newf.exists() || newf.mkdirs()
newf.exists() || newf.mkdirs()
總是返回False ,這意味着我在 SdCard 上沒有新目錄。
有一些結果日志:
Smali Directory: /storage/AF7E-4CF0/toolbox/IPHONE_CONTROL_PSYCHO/smali
BACKUP DIR: /storage/AF7E-4CF0/toolbox/IPHONE_CONTROL_PSYCHO/smali-BACKUP
HAVE 141 file to backup
Old: /storage/AF7E-4CF0/toolbox/IPHONE_CONTROL_PSYCHO/smali/android/support/v9/app/a.smali
New: /storage/AF7E-4CF0/toolbox/IPHONE_CONTROL_PSYCHO/smali-BACKUP/android/support/v9/app/a.smali
[w] EXISTS: false | MKDIRS: false
Canceled!
Old: /storage/AF7E-4CF0/toolbox/IPHONE_CONTROL_PSYCHO/smali/android/support/v9/app/aa.smali
New: /storage/AF7E-4CF0/toolbox/IPHONE_CONTROL_PSYCHO/smali-BACKUP/android/support/v9/app/aa.smali
[w] EXISTS: false | MKDIRS: false
Canceled!
Old: /storage/AF7E-4CF0/toolbox/IPHONE_CONTROL_PSYCHO/smali/android/support/v9/app/ab.smali
New: /storage/AF7E-4CF0/toolbox/IPHONE_CONTROL_PSYCHO/smali-BACKUP/android/support/v9/app/ab.smali
[w] EXISTS: false | MKDIRS: false
Canceled!
.....
注2:如果我在內部存儲中備份一個目錄,如/storage/emulated/0/tool
,此代碼運行良好! 那么什么問題,我該如何解決呢?
將以下內容添加到您的清單中:
<application
android:requestLegacyExternalStorage="true"
...
因為要求Manifest.permission.WRITE_EXTERNAL_STORAGE
對 Android 10+ 來說已經不夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.