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.


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


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


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


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

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.


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

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

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

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


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


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

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

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
                    }

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.