2017-02-26 93 views
8

我使用下面的代碼來創建一些臨時文件,並將tem包裝爲inputsteam發送到客戶端。如何刪除在android中退出應用程序時由createTempFile創建的所有臨時文件?

據我所知,當磁盤空間不足時,可以通過android系統自動刪除臨時文件。

但我希望我可以在我退出應用程序時自行刪除臨時文件,我該怎麼辦?謝謝!

代碼

File outputDir = context.getCacheDir(); // context being the Activity pointer 
File outputFile = File.createTempFile("prefix", "extension", outputDir); 

回答

3

刪除onDestroy中的文件如果isChangingConfigurations()falseisFinishingtrue。例如:

@Override protected void onDestroy() { 
    super.onDestroy(); 
    if(!isChangingConfigurations()) { 
    deleteTempFiles(getCacheDir()); 
    } 
} 

private boolean deleteTempFiles(File file) { 
    if (file.isDirectory()) { 
    File[] files = file.listFiles(); 
    if (files != null) { 
     for (File f : files) { 
     if (f.isDirectory()) { 
      deleteTempFiles(f); 
     } else { 
      f.delete(); 
     } 
     } 
    } 
    } 
    return file.delete(); 
} 
+0

謝謝!我測試你的代碼,沒關係 – HelloCW

+0

如果在後臺使用「Close All」關閉應用程序,這仍然不會被調用 – justdan0227

5

呼叫deleteOnExit()方法!

或者

呼叫delete()方法在活動onStop()

編輯:

它可能會更好,如果你在onDestroy()delete(),以確保您的代碼的工作,即使應用程序是由系統破壞。

+1

謝謝!但deleteOnExit()「請注意,在Android上,應用程序生命週期不包含VM終止,因此調用此方法將不能確保刪除文件,而應使用最合適的」: – HelloCW

+0

如果使用delete() ,我必須將這些文件名添加到靜態數組中,然後逐個刪除它們 – HelloCW

+0

好吧,然後在'onStop()' –

0

首先,請記住,Android應用程序的「退出」意味着與桌面應用程序的不同。有關詳細信息,請參閱this article,但簡短的回答是,一般來說,當操作系統實際上要關閉您的應用程序時(即使它不可見),您有不知道。事實上,沒有明確的保證,操作系統將完全關閉它。

一些想法可以在這裏找到(它是C#/ Xamarin.Android但對Java完全相同的想法):How to detect application exit on android?

除了所列的東西,你也可以嘗試註冊廣播接收器時,手機的關閉。

另一種(更糟糕的是,在我看來)的方式是簡單地做到這一點,當應用程序不再可見(在onStop)。然而,如上所述,這與程序實際關閉不同(因爲您不知道何時 - 甚至是否 - 操作系統將實際關閉應用程序)。

0

如果您可以爲所創建的所有文件保留一個Set(避免重複),那將會更好。

迭代文件列表並逐個刪除每個文件。

public static final Set<String> TMP_FILES = new HashSet<>(); 

並通過迭代刪除所有。

public void deleteTempFiles() { 
    for(String myTempFile: TMP_FILES) { 
    try { 
     new File(myTempFile).delete(); 
    } catch (Exception e) { 
     // Handle if needed. 
    } 
    } 
} 
+0

如果集合中的某個臨時文件是非空目錄。 –

+0

@JaredRummler它只是一個樣本。如果涉及目錄,則應該處理它。另外,問題是他使用createTempFile(PREFIX,SUFFIX)創建臨時文件,這將創建一個不是目錄的文件。 – Sridhar

+0

在其他答案的評論中,他發佈了關於刪除整個緩存目錄的建議。我只是想清楚,在這種情況下這是行不通的。 –

0

不幸的是,它似乎你必須逐個刪除這些文件,通過以前保存在一個數組中。

這就是說,如果你在這個問題上檢查Android開發者page,它就會讓你彷彿可以定期刪除緩存文件,並定期刪除不再需要的其他文件。但是我不認爲有關於如何去做的解釋。

相關問題