131 votes

Comment supprimer un fichier de la carte SD?

Je crée un fichier à envoyer en pièce jointe à un courrier électronique. Maintenant, je veux supprimer l'image après l'envoi du courrier électronique. Est-il possible de supprimer le fichier?

J'ai essayé myFile.delete(); mais cela n'a pas supprimé le fichier.


J'utilise ce code pour Android, le langage de programmation est donc Java en utilisant les méthodes habituelles d'Android pour accéder à la carte SD. Je supprime le fichier dans la méthode onActivityResult , lorsqu'un Intent est renvoyé à l'écran après l'envoi d'un courrier électronique.

358voto

Niko Gamulin Points 18058
 File file = new File(selectedFilePath);
boolean deleted = file.delete();
 

où selectedFilePath est le chemin du fichier que vous souhaitez supprimer - par exemple:

/sdcard/YourCustomDirectory/ExampleFile.mp3

79voto

neeloor2004 Points 681

Vous devez également donner la permission si vous utilisez> 1.6 SDK

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

en AndroidManifest.xml fichier

37voto

stevo.mit Points 358

Changement pour Android 4.4+

Les applications sont pas autorisés à écrire (suppression, modification ...) à l' externe de stockage à l'exception de leur package spécifique répertoires.

Comme Android états de documentation:

"Les applications ne doivent pas être autorisés à écrire à l'enseignement secondaire de stockage externe les appareils, sauf dans leur paquet répertoires spécifiques tel que permis par l' synthétisé les autorisations."

Cependant méchant solution de contournement existe (voir le code ci-dessous). Testé sur Samsung Galaxy S4, mais ce correctif ne fonctionne pas sur tous les appareils. Aussi, je n'aurais pas compter sur cette solution de contournement est disponible dans de futures versions d'Android.

Il y a un excellent article expliquant (4.4+) de stockage externe autorisations de changement.

Vous pouvez lire plus sur la solution de contournement. Solution de contournement code source est à partir de ce 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; 
   } 
}

18voto

Yossi Points 621

Le contexte Android a la méthode suivante:

 public abstract boolean deleteFile (String name)
 

Je crois que cela va faire ce que vous voulez avec les bonnes prémissions App comme indiqué ci-dessus.

11voto

Nepster Points 893

Supprimer récursivement tous les enfants du fichier ...

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

        fileOrDirectory.delete();
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X