2013-08-21 25 views
4

我正在閱讀Android SDK docFile.class中的renameTo(File)文檔。Android中的file.renameTo(文件)會出什麼問題

我們已經使用在生產中,而這種方法是,還是我一直想知道什麼是可能的事情可能出錯。該文件說

重命名該文件以NEWPATH。該操作對於文件和目錄均受支持。

許多故障是可能的。一些更可能的故障包括:

  • 對包含源路徑和目標路徑的目錄需要寫入權限。

  • 兩條路徑的所有父母都需要搜索許可。

  • 兩個路徑在相同的安裝點。在Android上,應用程序是最 可能試圖 內部存儲和SD卡之間進行復制時,以達到此限制。請注意,此方法不失敗拋出IOException異常 。呼叫者必須檢查返回值。

什麼是爲什麼renameTo()可能會失敗(指更有可能失敗)其他可能的原因是什麼?撥打renameTo後有沒有保證的狀態?當renameTo()失敗時,我可以依靠還有我的原始文件嗎?我想檢查的任何其他條件,以確保它在文檔中描述的旁邊工作?

回答

2

在Android File.rename中調用Linux rename()(通過libcore)。您可以檢查POSIX standard以瞭解可能的故障列表,但在Linux上可能略有不同,但應該給出一般意見。

還要注意這樣的說法:

如果rename()函數比[EIO]以外的任何原因而失敗,通過新的命名的任何文件應不受影響。

3

這三個列出的都是更有可能是失敗。不太可能(但是有可能!)故障包括

  • 用戶錯誤(例如,源是一個文件和目標是現有的目錄,或反之亦然)上留下設備
  • 沒有空間
  • 文件系統安裝只讀只有
  • 文件系統損壞
  • 壞扇區旋轉盤
  • 上...

由於Android是基於Linux,你也許可以依靠這些雖然:

  • 如果重命名失敗這兩個文件都保留,因爲他們是
  • 如果目標文件存在,並重新命名成功,在我們絕不會將任何過程找到目標文件丟失(更換是原子)
0

對於那些我不知道的原因,這是不可能的使用file.rename()之間不同的安裝可怕的移動文件(如sdcard0和sdcard1),這裏是我的解決方案,它適用於我:

if(canRename(f1, f2)) { 
    if(!f1.renameTo(f2)) { 
     Log.e(TAG, "Error to move new app: " + f1 + " > " + f2); 
    } 
} else { 
    try { 
     copy(f1, f2); 
     f1.delete(); 
    } catch (Exception ex) { 
     Log.e(TAG, "Error to move new app: " + f1 + " > " + f2); 
    } 
} 

private void copy(final File f1, final File f2) throws IOException { 
    f2.createNewFile(); 

    final RandomAccessFile file1 = new RandomAccessFile(f1, "r"); 
    final RandomAccessFile file2 = new RandomAccessFile(f2, "rw"); 

    file2.getChannel().write(file1.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, f1.length())); 

    file1.close(); 
    file2.close(); 
} 

private boolean canRename(final File f1, final File f2) { 
    final String p1 = f1.getAbsolutePath().replaceAll("^(/mnt/|/)", ""); 
    final String p2 = f2.getAbsolutePath().replaceAll("^(/mnt/|/)", ""); 

    return p1.replaceAll("\\/\\w+", "").equals(p2.replaceAll("\\/\\w+", "")); 
} 
+1

謝謝。從文檔中可以看出,不同安裝點之間的重命名不起作用。這個問題的目的是要了解還有什麼可以出錯的。 – philipp

+0

@ user1079877我已經使用你的代碼重新命名broadcastreceiver上的圖像,它完美的工作,直到android 6,因爲你知道在運行時檢查權限,所以現在f2.createNewFile(); 引發訪問被拒絕的異常,您有任何優惠嗎? –