¿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.


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


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


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; 
   } 
}

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.


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();
}

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))));

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"/>

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


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 ...


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);

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();

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
                    }

¡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());
  }
}

-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();

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.