2010-05-07 22 views
46

Sto cercando di aprire un file in Android come questo:prova se il file esiste

try 
    { 
     FileInputStream fIn = context.openFileInput(FILE); 
     DataInputStream in = new DataInputStream(fIn); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     if(in!=null) 
      in.close(); 
    } 
    catch(Exception e) 
    { } 

, ma nel caso in cui il file non esiste un file viene lanciata non trovato eccezione. Mi piacerebbe sapere come posso verificare se il file esiste prima di tentare di aprirlo.

+2

Se questo è il gestore di eccezioni effettivo, ripensarlo. http://www.rockstarprogrammer.org/post/2007/jun/15/empty-catch-blocks-are-always-wrong/ – Thomas

+0

@Thomas che era il mio gestore di eccezioni MY per una clausola come questa (copiata code la 'Rete.) Immagino che una buona regola per copiare sia esaminare tutto prima di usarlo effettivamente. Ho abbastanza problemi ad usare il mio codice. –

risposta

26

La documentazione dice Context.openFileInput o restituisce un (file trovato) inputStream o lancia una FileNotFoundException (non trovato)

http://developer.android.com/reference/android/content/Context.html#openFileInput(java.lang.String)

Quindi sembra che l'eccezione è la vostra "test".

Si potrebbe anche provare a utilizzare standard di

java.io.File file = new java.io.File(PATHTOYOURCONTEXT , FILE); 
if (file.exists()) { 
    FileInputStream fIn = new FileInputStream(file); 
} 

Ma questo non è raccomandato. Context.openFileInput() e Context.openFileOutput() assicurati di rimanere nel contesto di archiviazione delle applicazioni sul dispositivo e che tutti i tuoi file vengano rimossi quando la tua app viene disinstallata.

+0

funziona bene per verificare se esiste un file di destinazione su scheda SD - grazie! – mishkin

+0

molto molto grazie :) –

+0

Perché non è raccomandato? –

2

perché non catturare l'eccezione FileNotFound e prenderla mentre il file non è presente.

+0

Questo è il modo in cui effettivamente faccio, ma mi chiedevo se c'è un altro modo – rantravee

+0

@rantravee: Il modo in cui stai facendo è catturare tutte le eccezioni. Oltre ad essere un po 'trascurato, non ti dice nemmeno perché si è verificata l'eccezione.Se rilevi solo 'FileNotFoundException', saprai quando lo noti che è stato generato perché il file non esiste (piuttosto che l'eccezione generica che potrebbe significare che qualcosa è andato storto con qualche chiamata nel tuo blocco try o roba chiama, o le cose che chiama chiamate, o ....) – cHao

+0

Generalmente è meglio se le eccezioni sono proprio questo - eccezioni. Controlla se il file esiste o meno, e se dopo averlo creato un po 'come ancora non esiste, tieni il try/catch come una caduta. – SK9

160

Penso che il modo migliore per sapere se un file esiste, senza in realtà cercando di aprirla, è la seguente:

File file = getContext().getFileStreamPath(FILE_NAME); 
if(file.exists()) ... 

Speranza che aiuta, ciao!

+0

Funziona, e presumo che sia più efficiente di ottenere un InputStream solo per vedere se il file esiste. Bello. –

+5

Cosa succede se FILE_NAME = nomefile + percorso? –

+0

cosa intendi? FILE_NAME dovrebbe essere un percorso file relativo alla directory privata (sconosciuta) della tua applicazione. Il fatto che FILE_NAME contenga sottodirectory non è un problema per testarne l'esistenza; se devi creare quel file, puoi assicurarti le sottodirectory richieste come al solito in Java, [vedi i documenti] (http://developer.android.com/reference/java/io/File.html#mkdirs()) – lencinhaus

0

Se si desidera aprire un file in ogni caso (cioè se non esiste crearne uno nuovo, se non accodare a quello vecchio) è possibile utilizzare questo, nessun test necessari:

public static void write_custom_log(String message){ 
     File root = Environment.getExternalStorageDirectory(); 
     try{ 
      BufferedWriter fw = new BufferedWriter(new FileWriter(new File("/mnt/sdcard/tjb_tests/tjb_log_file.txt"),true)); 

      if (root.canWrite()){ 
       fw.write(message); 
       fw.close(); 
       } 
      } catch (IOException e) { 
       Log.e("One", "Could not write file " + e.getMessage()); 
      } 
    } 
-2

Il mio suggerimento è di controllare la lunghezza del file. if file.length() returns 0 significa che il file non esiste.

+9

Potrebbe esserci un file con lunghezza 0 – AaA

5

Con lo standard java.io.File Questa è la funzione che ho creato, e funziona correttamente:

private static final String APP_SD_PATH = "/Android/data/com.pkg.myPackage"; 
... 
public boolean fileExistsInSD(String sFileName){ 
    String sFolder = Environment.getExternalStorageDirectory().toString() + 
      APP_SD_PATH + "/Myfolder"; 
    String sFile=sFolder+"/"+sFileName; 
    java.io.File file = new java.io.File(sFile); 
    return file.exists(); 
} 
+0

Context.getExternalFilesDir() restituisce lo stesso di Environment.getExternalStorageDirectory(). ToString() + APP_SD_PATH – riper

1

Se si vuole garantire un file esiste (cioè se non esiste crearne uno nuovo, se non allora non cancellare) quindi utilizzare File.createNewFile:

https://docs.oracle.com/javase/7/docs/api/java/io/File.html#createNewFile()

esempio

{ 
     String pathName = <file path name> 
     File file = new File (pathName); 
     Uri pathURI = Uri.fromFile (file); 
     boolean created; 

     String mIOException = ""; 
     String mSecException = ""; 

     try 
     { 
      created = file.createNewFile(); 

      if (created) 
      { 
       ctxt.sendBroadcast (new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, pathURI)); 
      } 
     } 
     catch (IOException ioex) 
     { 
      mIOException = ioex.getMessage(); 
     } 
     catch (SecurityException sex) 
     { 
      mSecException = sex.getMessage(); 
     } 

} 
Problemi correlati