2009-08-08 33 views
126

Estoy creando un archivo para enviar como archivo adjunto a un correo electrónico. Ahora quiero eliminar la imagen después de enviar el correo electrónico. ¿Hay alguna manera de eliminar el archivo?¿Cómo eliminar un archivo de la tarjeta SD?

He intentado myFile.delete(); pero no eliminó el archivo.


Estoy usando este código para Android, por lo que el lenguaje de programación Java está usando las formas habituales de Android para acceder a la tarjeta SD. Estoy borrando el archivo en el método onActivityResult, cuando se devuelve un Intent a la pantalla después de enviar un correo electrónico.

+0

Es necesario proporcione más información sobre el problema, como qué idioma está utilizando, cómo está accediendo a la tarjeta SD, etc. – Amok

+0

¿Está descargando los cambios en el disco? –

+10

@Amuck Creo que es seguro asumir que está usando Java ya que no especificó. –

Respuesta

352
File file = new File(selectedFilePath); 
boolean deleted = file.delete(); 

donde selectedFilePath es la ruta del archivo que desea borrar - por ejemplo:

/sdcard/YourCustomDirectory/ExampleFile.mp3

+0

Creo que los niños internos no se eliminan ... tiene que eliminar todos los niños internos. Consulte mi respuesta a continuación. – Nepster

+1

Lamentablemente, esto no funcionará en Android 4.4+. Ver mi respuesta a continuación. –

+0

No entiendo cómo funcionó esto para muchos. "eliminado" parece atenuado en Android Studio. – TheOnlyAnil

79

También hay que dar permiso si estás usando> 1.6 SDK

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 

en AndroidManifest.xml archivo

16

Contexto Android tiene el siguiente método:

public abstract boolean deleteFile (String name) 

creo que esto va a hacer lo que quiera con las derechas de la aplicación premissions como se indica anteriormente.

+2

Esta debería ser la respuesta correcta. 'contexto.deleteFile (nombre de fichero); ' – Lisandro

6
public static boolean deleteDirectory(File path) { 
    // TODO Auto-generated method stub 
    if(path.exists()) { 
     File[] files = path.listFiles(); 
     for(int i=0; i<files.length; i++) { 
      if(files[i].isDirectory()) { 
       deleteDirectory(files[i]); 
      } 
      else { 
       files[i].delete(); 
      } 
     } 
    } 
    return(path.delete()); 
} 

Este Código le ayudará .. y en Android Manifiesto Usted tiene que obtener el permiso para realizar modificaciones ..

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
+0

archivos [] pueden ser nulos si: ' File.Exists: true file.isDirectory: verdadera file.canRead: falsa file.canWrite: – Andreyua

11

borrar recursivamente todos los niños del archivo ...

public static void DeleteRecursive(File fileOrDirectory) 
    { 
     if (fileOrDirectory.isDirectory()) 
     { 
      for (File child : fileOrDirectory.listFiles()) 
      { 
       DeleteRecursive(child); 
      } 
     } 

     fileOrDirectory.delete(); 
    } 
33

Cambio para Android 4.4+

Las aplicaciones son no permitido a escritura(borrar, modificar ...) a externa almacenamiento excepto a sus directorios específicas para dicho paquete.

Como estados de documentación Android:

"Aplicaciones no se debe permitir escribir en almacenamiento externo secundario dispositivos, excepto en sus directorios de paquete específico como lo permite la permisos sintetizados."

Sin embargo existe solución desagradable(ver código de abajo). Probado en Samsung Galaxy S4, pero esta solución no funciona en todos los dispositivos.También I no contaría con esta solución está disponible en futuras versiones de Android.

Hay un great article explaining (4.4+) external storage permissions change.

Puede leer more about workaround here. El código fuente de la solución temporal es de this site.

public class MediaFileFunctions 
{ 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    public static boolean deleteViaContentProvider(Context context, String fullname) 
    { 
     Uri uri=getFileUri(context,fullname); 

     if (uri==null) 
     { 
     return false; 
     } 

     try 
     { 
     ContentResolver resolver=context.getContentResolver(); 

     // change type to image, otherwise nothing will be deleted 
     ContentValues contentValues = new ContentValues(); 
     int media_type = 1; 
     contentValues.put("media_type", media_type); 
     resolver.update(uri, contentValues, null, null); 

     return resolver.delete(uri, null, null) > 0; 
     } 
     catch (Throwable e) 
     { 
     return false; 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    private static Uri getFileUri(Context context, String fullname) 
    { 
     // Note: check outside this class whether the OS version is >= 11 
     Uri uri = null; 
     Cursor cursor = null; 
     ContentResolver contentResolver = null; 

     try 
     { 
     contentResolver=context.getContentResolver(); 
     if (contentResolver == null) 
      return null; 

     uri=MediaStore.Files.getContentUri("external"); 
     String[] projection = new String[2]; 
     projection[0] = "_id"; 
     projection[1] = "_data"; 
     String selection = "_data = ? "; // this avoids SQL injection 
     String[] selectionParams = new String[1]; 
     selectionParams[0] = fullname; 
     String sortOrder = "_id"; 
     cursor=contentResolver.query(uri, projection, selection, selectionParams, sortOrder); 

     if (cursor!=null) 
     { 
      try 
      { 
       if (cursor.getCount() > 0) // file present! 
       { 
        cursor.moveToFirst(); 
        int dataColumn=cursor.getColumnIndex("_data"); 
        String s = cursor.getString(dataColumn); 
        if (!s.equals(fullname)) 
        return null; 
        int idColumn = cursor.getColumnIndex("_id"); 
        long id = cursor.getLong(idColumn); 
        uri= MediaStore.Files.getContentUri("external",id); 
       } 
       else // file isn't in the media database! 
       { 
        ContentValues contentValues=new ContentValues(); 
        contentValues.put("_data",fullname); 
        uri = MediaStore.Files.getContentUri("external"); 
        uri = contentResolver.insert(uri,contentValues); 
       } 
      } 
      catch (Throwable e) 
      { 
       uri = null; 
      } 
      finally 
      { 
       cursor.close(); 
      } 
     } 
     } 
     catch (Throwable e) 
     { 
     uri=null; 
     } 
     return uri; 
    } 
} 
+1

false' que no trabaja para Note3. Recibí el error "MediaProvider: Could not delete /mnt/extSdCard/test.zip" – iscariot

+2

Tengo una Moto X sin arrancar en 4.4.4 y no tengo problemas para escribir en/sdcard/mydirectory – Rob

+0

"Lamentablemente ya no funciona las versiones más nuevas de Kitkat, todo ha sido bloqueado ". citado del autor "ghisler (Autor)" – HendraWD

7

Esto funciona para mí: (Eliminar imagen de la Galería)

File file = new File(photoPath); 
file.delete(); 

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath)))); 
+2

¿Qué hace context.sendBroadcast()? – Megaetron

+0

Básicamente, envía/transmite la intención (operación que se realizará) a todos los receptores que coincidan con esta intención. [link] (http://developer.android.com/reference/android/content/Context.html) – Jiyeh

0

Esto funcionó para mí.

String myFile = "/Name Folder/File.jpg"; 

String my_Path = Environment.getExternalStorageDirectory()+myFile; 

File f = new File(my_Path); 
Boolean deleted = f.delete(); 
1

Lo siento: hay un error en mi código antes debido a la validación del sitio.

String myFile = "/Name Folder/File.jpg"; 

String myPath = Environment.getExternalStorageDirectory()+myFile; 

File f = new File(myPath); 
Boolean deleted = f.delete(); 

Creo que está claro ... primer lugar hay que conocer la ubicación del archivo. Segundo ,,, Environment.getExternalStorageDirectory() es un método que obtiene su directorio de aplicaciones. Por último, la clase Archivo que maneja su archivo ...

1

Tuve un problema similar con una aplicación que se ejecuta en 4.4. Lo que hice fue una especie de truco.

Cambié el nombre de los archivos y los ignoré en mi aplicación.

es decir.

File sdcard = Environment.getExternalStorageDirectory(); 
       File from = new File(sdcard,"/ecatAgent/"+fileV); 
       File to = new File(sdcard,"/ecatAgent/"+"Delete"); 
       from.renameTo(to); 
4

Pruebe esto.

File file = new File(FilePath); 
FileUtils.deleteDirectory(file); 

de Apache Commons

0
private boolean deleteFromExternalStorage(File file) { 
         String fileName = "/Music/"; 
         String myPath= Environment.getExternalStorageDirectory().getAbsolutePath() + fileName; 

         file = new File(myPath); 
         System.out.println("fullPath - " + myPath); 
          if (file.exists() && file.canRead()) { 
           System.out.println(" Test - "); 
           file.delete(); 
           return false; // File exists 
          } 
          System.out.println(" Test2 - "); 
          return true; // File not exists 
        } 
+0

¡Tiene que dar alguna explicación sobre su código! :) –

+0

Lea el archivo getExternalStorageDirectory + add "/ Music /" es mi ruta de acceso -> mypath =/storage/sdcard/Music /. El archivo de comprobación existe o no existe y léelo. eliminar si existe Esto es borrar toda la música de la lista en el directorio de música –

+0

¡Agregue lo mismo a la respuesta! :) –

0
File filedel = new File("/storage/sdcard0/Baahubali.mp3"); 
boolean deleted1 = filedel.delete(); 

O, intenta esto:

String del="/storage/sdcard0/Baahubali.mp3"; 
File filedel2 = new File(del); 
boolean deleted1 = filedel2.delete(); 
0

Usted puede eliminar un archivo de la siguiente manera:

File file = new File("your sdcard path is here which you want to delete"); 
file.delete(); 
if (file.exists()){ 
    file.getCanonicalFile().delete(); 
    if (file.exists()){ 
    deleteFile(file.getName()); 
    } 
} 
Cuestiones relacionadas