web-dev-qa-db-fra.com

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 de l'e-mail. Est-il possible de supprimer le fichier?

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


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

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

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

/sdcard/YourCustomDirectory/ExampleFile.mp3

357
Niko Gamulin

De plus, vous devez donner votre permission si vous utilisez> 1.6 SDK

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

dans le fichier AndroidManifest.xml

78
neeloor2004

Changer pour Android 4.4+

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

Comme Android, la documentation indique:

"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 cette solution de contournement 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 étant disponible dans versions futures d'Android.

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

Vous pouvez lire plus d'informations sur la solution de contournement ici . Le code source de cette solution 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; 
   } 
}
34
stevo.mit

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 énumérées ci-dessus.

17
Yossi

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();
    }
11
Xar E Ahmer

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))));
9
Jiyeh
 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 Android Manifeste, vous devez obtenir la permission de le modifier ..

 <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
6
Vivek Elangovan

Essaye ça.

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

d'Apache Commons

4
Rahul Giradkar

Désolé, il y a une erreur dans mon code auparavant à 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. Deuxièmement , Environment.getExternalStorageDirectory() est une méthode qui récupère votre répertoire d'applications. Enfin, la classe File qui gère votre fichier ...

1
Denis IJCU

J'ai eu un problème similaire avec une application fonctionnant sur 4.4. Ce que j'ai fait était en quelque sorte un bidouillage.

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);
1
kkm
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
                    }
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());
  }
}
0
Makvin

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
Denis IJCU