¿Cómo borrar un archivo de la tarjeta SD?

131

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 forma de eliminar el archivo?

Lo intenté myFile.delete();pero no eliminó el archivo.


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

mudit
fuente
Es necesario proporcionar más información sobre el problema, tales como el idioma que está utilizando, cómo se está accediendo a la tarjeta SD, etc.
Amok
¿Estás vaciando los cambios en el disco?
Charles Ma
10
@Amuck Creo que es seguro asumir que está usando Java ya que no especificó.
Jeremy Logan
Suena muy sospechoso si me preguntas ...
Studocwho

Respuestas:

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

donde selectedFilePath es la ruta del archivo que desea eliminar, por ejemplo:

/sdcard/YourCustomDirectory/ExampleFile.mp3

Niko Gamulin
fuente
Creo que los niños internos no se eliminan ... tienes que eliminar todos los niños internos. Mira mi respuesta a continuación ...
Zar E Ahmer
2
Lamentablemente, esto no funcionará en Android 4.4+. Vea mi respuesta a continuación.
stevo.mit
No entiendo cómo funcionó esto para muchos. "eliminado" aparece atenuado en Android Studio.
TheOnlyAnil
Sí, estaba enviando una ruta como "archivo: /// almacenamiento / ..." que no funcionó
Jemshit Iskenderov
1
@ stevo.mit, ¿encontraste la solución? También estoy enfrentando el mismo problema, no puedo eliminar el archivo de la tarjeta SD por encima de Android 4.4+. Pero el mismo código funciona para 4.3 /
hasnain_ahmad
79

También debe dar permiso si está utilizando> 1.6 SDK

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

en AndroidManifest.xmlarchivo

neeloor2004
fuente
pero para el almacenamiento extraíble de la tarjeta SD también necesitaContentResolver
usuario25
35

Cambiar para Android 4.4+

Las aplicaciones se no se les permite a escribir (borrar, modificar ...) al exterior de almacenamiento , excepto a sus paquetes específicos de directorios.

Como dice la documentación de Android:

"No se debe permitir que las aplicaciones escriban en dispositivos de almacenamiento externo secundarios, excepto en sus directorios específicos del paquete según lo permitan los permisos sintetizados".

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

Hay un gran artículo que explica el cambio de permisos de almacenamiento externo (4.4+) .

Puede leer más sobre la solución aquí . El código fuente de la solución es de este sitio .

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; 
   } 
}
stevo.mit
fuente
1
No funciona para la nota 3. Recibí el error "MediaProvider: No se pudo eliminar /mnt/extSdCard/test.zip"
iscariot
2
Tengo un Moto X sin raíz en 4.4.4 y no tengo problemas para escribir en / sdcard / mydirectory
Rob
"Desafortunadamente, ya no funciona en las versiones más nuevas de Kitkat, todo ha sido bloqueado". citado del autor "ghisler (Autor)"
HendraWD
Android se está cerrando cada vez más. ¡Terminaremos con una copia fea de iOS!
Phantômaxx
Esto falla para mí (Android 7.1). Siempre regresa falsey no elimina el archivo :-(
Spikatrix
18

El contexto de Android tiene el siguiente método:

public abstract boolean deleteFile (String name)

Creo que esto hará lo que desee con los permisos de aplicación correctos como se enumeran anteriormente.

Yossi
fuente
3
Esta debería ser la respuesta correcta. context.deleteFile(filename);
Lisandro
11

Elimina recursivamente todos los elementos secundarios del archivo ...

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

    fileOrDirectory.delete();
}
Zar E Ahmer
fuente
9

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))));
Jiyeh
fuente
2
¿Qué hace context.sendBroadcast ()?
Megaetron
Básicamente, envía / difunde la intención (operación a realizar) a todos los receptores que coincidan con esta intención. enlace
Jiyeh
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 lo ayudará ... Y en el Manifiesto de Android, debe obtener permiso para realizar modificaciones.

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Vivek Elangovan
fuente
los archivos [] pueden ser nulos si:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw
Supongo que ustedes no saben que algunos teléfonos Android restringen el acceso de escritura a las tarjetas SD.
4

Prueba esto.

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

de Apache Commons

Rahul Giradkar
fuente
1

Lo sentimos: 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 ... Primero debes saber la ubicación de tu archivo. Segundo ,,, Environment.getExternalStorageDirectory()es un método que obtiene su directorio de aplicaciones. Por último, el archivo de clase que maneja su archivo ...

Denis IJCU
fuente
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);
kkm
fuente
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();
Denis IJCU
fuente
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
                    }
Lâm Nguyễn Tuấn
fuente
¡Necesitas dar alguna explicación sobre tu código! :)
Sanket Makani
Lea el archivo getExternalStorageDirectory + agregue "/ Music /" es mi ruta -> mypath = / storage / sdcard / Music /. Verifique el archivo existe o no existe y léalo. Eliminar si existe. Esto es eliminar toda la música de la lista en el directorio Música
Lâm Nguyễn Tuấn
Añadir lo mismo a la respuesta! :)
Sanket Makani
0

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());
  }
}
Makvin
fuente
-1
File filedel = new File("/storage/sdcard0/Baahubali.mp3");
boolean deleted1 = filedel.delete();

O intente esto:

String del="/storage/sdcard0/Baahubali.mp3";
File filedel2 = new File(del);
boolean deleted1 = filedel2.delete();
Laxman Ghuge
fuente
1
Ambos ejemplos son más o menos iguales. Además, la respuesta más votada dice exactamente hacer esto. No puedo ver qué más esta respuesta agrega la pregunta. Además, esto no funcionará para archivos en un almacenamiento externo (como la tarjeta SD) desde Android Kitkat en adelante IIRC
Spikatrix