2013-12-16 36 views
1

我使用File f = new File(s)按鈕來創建一個新文件,並保存該文件。然後使用.fileList()/ getApplicationContext()。fileList()(這兩個工作)收集'saved'文件,並將其用於for循環以保存到ArrayList,然後將其傳遞給ListView的ListAdapter。在適配器中,我設置了一個按鈕來刪除每個文件。我在代碼的每個部分放置了日誌,當我按下一個按鈕時,單獨的按鈕和文件被識別,但是在f.exists()中它總是返回null。即使列表是使用收集的文件創建的,因此文件必須存在,它始終返回null。爲什麼是這樣?我一直在嘗試調試3天!從適配器在Android上檢查文件的問題

代碼刪除(一切在適配器作品):

public void onClick(View v) { 
    try { 
     File f = new File(getChild(groupPosition, childPosition).toString()); 
     if (f.getAbsoluteFile().exists()) { 
      f.delete(); 
      Log.d("delete", f.getAbsolutePath().toString() + " is deleted!"); 
     } else { 
      Log.d("delete", f.getAbsolutePath().toString() + ": doesn't exist?"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

編輯: 試圖以刪除數據目錄

(通過=新的文件(縣)創建的)中的所有文件
String [] filenames = getApplicationContext().fileList(); 
if (filenames.length > 0) { 
    for (int i = 0; i < filenames.length; i++) { 
     File f = new File(filenames[i]); 
     Log.d("file selected:", f.getName()); 
     Log.d("file path:", f.getAbsolutePath().toString()); 
     if (f.exists()) { 
      if (f.delete()) { 
       Log.d("deleted:", f.getName()); 
      } else { 
       Log.d("couldn't delete:", f.getName()); 
      } 
     } else { 
      Log.d("doesn't exist:", f.getName()); 
     } 
    } 
} 

所以這種方法在堆棧跟蹤:(+10人)

12-16 21:31:11.187: D/file selected:(1270): new_recipe 
12-16 21:31:11.187: D/file path:(1270): /new_recipe 
12-16 21:31:11.187: D/doesn't exist:(1270): new_recipe 
12-16 21:31:11.197: D/file selected:(1270): Untitled_Recipe 
12-16 21:31:11.197: D/file path:(1270): /Untitled_Recipe 
12-16 21:31:11.197: D/doesn't exist:(1270): Untitled_Recipe 
12-16 21:31:11.197: D/file selected:(1270): hgk 
12-16 21:31:11.197: D/file path:(1270): /hgk 
12-16 21:31:11.197: D/doesn't exist:(1270): hgk 

AAARGH!

+0

發佈您的'適配器'代碼 – Apoorv

+0

發佈。 fyi文件名/ listview名稱,基本上每個文件名在整個應用程序中都是靜態的 – Ollygrov

+0

嘗試添加一些日誌記錄並查看getChild(groupPosition,childPosition).toString()產生的內容,它是否是正確的文件路徑? – Sun

回答

1

此行爲的原因是,File只是圍繞路徑String包裝並返回需求信息,如exists()。因此,當您創建名稱爲「不存在」的新File時,getName()等將仍然有效。

沒有什麼是文件系統上創建真的,當你調用新的文件(「文件名」)

只在內存中的對象,然後你可以調用file.createNewFile()創建的指定位置空文件。

如果通過getApplicationContext().fileList()這些文件是在應用程序的專用存儲中獲取文件,並有與getApplicationContext().openFileOutput("fileName", mode)創建的,他們的真實路徑是/data/data/<your package name>/files/<filename>.對於這些文件不需要File對象。創建,修改或刪除。一切都應該通過Context和文件名來處理。

+0

感謝您的回覆,deleteFile()不適用於我,我已經將文件名放入一個String數組中,然後從數組中取出名稱並用它調用方法,但它不想。我需要特殊的權限嗎? – Ollygrov

+0

不,你不需要任何權限,因爲通過listFiles()你只能訪問你的私有存儲。檢查了它。 –

+0

太棒了!是的,我發現文件只是一個文件的實例。現在我使用打開的文件輸入和創建文件,使用文件和對象輸入流來寫入數據。非常感謝! – Ollygrov