Comment supprimer un fichier de la carte SD?

131

Je crée un fichier à envoyer en pièce jointe à un e-mail. Maintenant, je veux supprimer l'image après avoir envoyé l'e-mail. Existe-t-il un moyen de supprimer le fichier?

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


J'utilise ce code pour Android, donc le langage de programmation est Java en utilisant les moyens Android habituels pour accéder à la carte SD. Je supprime le fichier dans la onActivityResultméthode, lorsqu'un Intentest renvoyé à l'écran après l'envoi d'un e-mail.

mudit
la source
Vous devez fournir plus d'informations sur le problème, telles que la langue que vous utilisez, la façon dont vous accédez à la carte SD, etc.
Amok
supprimez-vous les modifications sur le disque?
Charles Ma
10
@Amuck Je pense qu'il est prudent de supposer qu'il utilise Java puisqu'il n'a pas précisé.
Jeremy Logan
Cela

Réponses:

359
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

Niko Gamulin
la source
Je pense que les enfants intérieurs ne sont pas supprimés .. vous devez supprimer tous les enfants intérieurs. Voir ma réponse ci-dessous ..
Zar E Ahmer
2
Malheureusement, cela ne fonctionnera pas sur Android 4.4+. Voir ma réponse ci-dessous.
stevo.mettre
Je ne comprends pas comment cela fonctionnait pour beaucoup. "supprimé" semble grisé dans Android Studio.
TheOnlyAnil
oui
j'envoyais un
1
@ stevo.mit avez-vous trouvé la solution? Je suis également confronté au même problème que je ne peux pas supprimer le fichier de la carte SD au-dessus d'Android 4.4+. Mais le même code fonctionne pour 4.3 /
hasnain_ahmad
79

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

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

dans le AndroidManifest.xmlfichier

neeloor2004
la source
mais pour le stockage sur carte SD amovible , vous avez également besoinContentResolver
user25
35

Changer pour Android 4.4+

Les applications ne sont pas autorisées à écrire (supprimer, modifier ...) sur le stockage externe , sauf dans leurs répertoires spécifiques au package .

Comme l'indique la documentation Android:

"Les applications ne doivent pas être autorisées à écrire sur des périphériques de stockage externes secondaires, sauf dans leurs répertoires spécifiques au package, comme le permettent les autorisations synthétisées."

Cependant, une solution de contournement désagréable existe (voir le code ci-dessous) . Testé sur Samsung Galaxy S4, mais ce correctif ne fonctionne pas sur tous les appareils. De plus, je ne compterais pas sur cette solution de contournement disponible dans les futures versions d'Android.

Il existe un excellent article expliquant le changement des autorisations de stockage externe (4.4+) .

Vous pouvez en savoir plus sur la solution de contournement ici . Le code source de la solution de contournement provient 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; 
   } 
}
stevo.mit
la source
1
Ne fonctionne pas pour note3. J'ai eu l'erreur "MediaProvider: Impossible de supprimer /mnt/extSdCard/test.zip"
iscariot
2
J'ai un Moto X non enraciné sur 4.4.4 et je n'ai aucun problème à écrire dans / sdcard / mydirectory
Rob
"Malheureusement, cela ne fonctionne plus sur les nouvelles versions de Kitkat, tout a été verrouillé." cité de l'auteur "ghisler (Auteur)"
HendraWD
Android se ferme de plus en plus. Nous allons finir avec une vilaine copie d'iOS !!
Phantômaxx
Cela échoue pour moi (Android 7.1). Il renvoie toujours falseet ne supprime pas le fichier :-(
Spikatrix
18

Le contexte Android utilise la méthode suivante:

public abstract boolean deleteFile (String name)

Je pense que cela fera ce que vous voulez avec les bonnes prémisses d'application énumérées ci-dessus.

Yossi
la source
3
Cela devrait être la bonne réponse. context.deleteFile(filename);
Lisandro
11

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();
}
Zar E Ahmer
la source
9

Cela fonctionne pour moi: (Supprimer l'image de la galerie)

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
Jiyeh
la source
2
Que fait context.sendBroadcast ()?
Megaetron
Fondamentalement, il envoie / diffuse l'intention (opération à effectuer) à tous les destinataires correspondant à cette intention. lien
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());
 }

Ce code vous aidera. Et dans le manifeste Android, vous devez obtenir la permission d'apporter des modifications.

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Vivek Elangovan
la source
files [] peuvent être nuls si:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw
Je suppose que vous ignorez complètement que certains téléphones Android restreignent l'accès en écriture aux cartes SD.
4

Essaye ça.

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

depuis Apache Commons

Rahul Giradkar
la source
1

Désolé: il y a une erreur dans mon code avant à cause de la validation du site.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

Je pense que c'est clair ... Vous devez d'abord connaître l'emplacement de votre fichier. La deuxième ,,, Environment.getExternalStorageDirectory()est une méthode qui obtient le répertoire de votre application. Enfin la classe File qui gère votre fichier ...

Denis IJCU
la source
1

J'ai eu un problème similaire avec une application fonctionnant sous 4.4. Ce que j'ai fait était une sorte de hack.

J'ai renommé les fichiers et les ai ignorés dans mon application.

c'est à dire.

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

Cela a fonctionné pour moi.

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

String my_Path = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(my_Path);
Boolean deleted = f.delete();
Denis IJCU
la source
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
la source
Vous devez fournir des explications sur votre code! :)
Sanket Makani
Lisez le fichier getExternalStorageDirectory + ajoutez "/ Music /" c'est le chemin de moi -> mypath = / storage / sdcard / Music /. Vérifiez que le fichier existe ou n'existe pas et lisez-le. supprimer s'il existe. Ceci est effacer toute la liste des musiques du répertoire Musique
Lâm Nguyễn Tuấn
Ajoutez la même chose à la réponse! :)
Sanket Makani
0

Vous pouvez supprimer un fichier comme suit:

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

Ou essayez ceci:

String del="/storage/sdcard0/Baahubali.mp3";
File filedel2 = new File(del);
boolean deleted1 = filedel2.delete();
Laxman Ghuge
la source
1
Vos deux exemples sont à peu près les mêmes. En outre, la réponse votée la plus élevée indique exactement de faire cela. Je ne vois pas ce que cette réponse ajoute de plus à la question. En outre, cela ne fonctionnera pas pour les fichiers dans un stockage externe (comme une carte SD) à partir d'Android Kitkat IIRC
Spikatrix