Wie lösche ich eine Datei von der SD-Karte?


131

Ich erstelle eine Datei, die als Anhang an eine E-Mail gesendet werden soll. Jetzt möchte ich das Bild nach dem Senden der E-Mail löschen. Gibt es eine Möglichkeit, die Datei zu löschen?

Ich habe es versucht, myFile.delete();aber die Datei wurde nicht gelöscht.


Ich verwende diesen Code für Android, daher ist die Programmiersprache Java, wobei die üblichen Android-Methoden für den Zugriff auf die SD-Karte verwendet werden. Ich lösche die Datei in der onActivityResultMethode, wenn Intentnach dem Senden einer E-Mail eine auf den Bildschirm zurückkehrt.


Sie müssen weitere Informationen über das Problem bereitstellen, z. B. welche Sprache Sie verwenden, wie Sie auf die SD-Karte zugreifen usw.
Amok

Leeren Sie die Änderungen auf die Festplatte?
Charles Ma

10
@Amuck Ich denke, es ist sicher anzunehmen, dass er Java verwendet, da er nicht angegeben hat.
Jeremy Logan

Klingt sehr verdächtig, wenn Sie mich fragen ...
Studocwho

Antworten:


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

Dabei ist selectedFilePath der Pfad der Datei, die Sie löschen möchten - zum Beispiel:

/sdcard/YourCustomDirectory/ExampleFile.mp3


Ich denke, innere Kinder werden nicht gelöscht. Sie müssen alle inneren Kinder löschen. Siehe meine Antwort unten.
Zar E Ahmer

2
Leider funktioniert dies unter Android 4.4+ nicht. Siehe meine Antwort unten.
stevo.mit

Ich verstehe nicht, wie das für viele funktioniert hat. "gelöscht" sieht in Android Studio ausgegraut aus.
TheOnlyAnil

Ja, ich habe einen Pfad wie "file: /// storage / ..."
gesendet,

1
@ stevo.mit hast du die lösung gefunden? Ich bin auch mit dem gleichen Problem konfrontiert kann Datei nicht von SD-Karte über Android 4.4+ löschen. Aber der gleiche Code funktioniert für 4.3 /
hasnain_ahmad

79

Außerdem müssen Sie eine Berechtigung erteilen, wenn Sie> 1.6 SDK verwenden

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

in AndroidManifest.xmlDatei


aber für austauschbaren SD-Kartenspeicher benötigen Sie auchContentResolver
user25

35

Ändern Sie für Android 4.4+

Apps sind nicht erlaubt zu schreiben (löschen, ändern ...) zu externen Speicher außer ihrer paketspezifische Verzeichnisse.

In der Android-Dokumentation heißt es:

"Apps dürfen nicht auf sekundäre externe Speichergeräte schreiben, außer in ihren paketspezifischen Verzeichnissen, wie dies durch synthetisierte Berechtigungen zulässig ist."

Allerdings böse Abhilfe besteht (siehe Code unten) . Getestet auf Samsung Galaxy S4, aber dieses Update funktioniert nicht auf allen Geräten. Ich würde auch nicht damit rechnen, dass diese Problemumgehung in zukünftigen Versionen von Android verfügbar ist.

Es gibt einen großartigen Artikel, in dem die Änderung der externen Speicherberechtigungen (4.4+) erläutert wird .

Sie können lesen Sie hier mehr über Abhilfe . Der Quellcode für die Problemumgehung stammt von dieser 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
Funktioniert nicht für Note3. Ich habe die Fehlermeldung "MediaProvider: /mnt/extSdCard/test.zip konnte nicht gelöscht werden"
iscariot

2
Ich habe ein Moto X ohne Wurzeln auf 4.4.4 und habe kein Problem damit, in / sdcard / mydirectory zu schreiben
Rob

"Leider funktioniert es bei neueren Versionen von Kitkat nicht mehr, es wurde alles gesperrt." zitiert aus dem Autor "ghisler (Autor)"
HendraWD

Android schließt sich immer mehr. Wir werden mit einer hässlichen Kopie von iOS enden !!
Phantômaxx

Dies schlägt für mich fehl (Android 7.1). Es gibt immer zurück falseund löscht die Datei nicht :-(
Spikatrix

18

Android Context hat die folgende Methode:

public abstract boolean deleteFile (String name)

Ich glaube, dies wird mit den oben aufgeführten richtigen App-Prämissen das tun, was Sie wollen.


3
Dies sollte die richtige Antwort sein. context.deleteFile(filename);
Lisandro

11

Löschen Sie rekursiv alle untergeordneten Elemente der Datei ...

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

    fileOrDirectory.delete();
}

9

Das funktioniert bei mir: (Bild aus Galerie löschen)

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));

2
Was macht context.sendBroadcast ()?
Megaetron

Grundsätzlich sendet / sendet es die Absicht (auszuführende Operation) an alle Empfänger, die dieser Absicht entsprechen. Link
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());
 }

Dieser Code wird Ihnen helfen. Und im Android-Manifest müssen Sie die Erlaubnis erhalten, Änderungen vorzunehmen.

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Dateien [] können null sein, wenn:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw

Ich denke ihr seid euch überhaupt nicht bewusst, dass einige Android-Handys den Schreibzugriff auf SD-Karten einschränken.

4

Versuche dies.

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

von Apache Commons


1

Entschuldigung: In meinem Code ist zuvor ein Fehler aufgrund der Site-Validierung aufgetreten.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

Ich denke ist klar ... Zuerst müssen Sie Ihren Dateispeicherort kennen. Zweitens Environment.getExternalStorageDirectory()ist eine Methode, die Ihr App-Verzeichnis erhält. Zuletzt die Klasse Datei, die Ihre Datei behandelt ...


1

Ich hatte ein ähnliches Problem mit einer Anwendung, die unter 4.4 ausgeführt wird. Was ich getan habe, war eine Art Hack.

Ich habe die Dateien umbenannt und sie in meiner Anwendung ignoriert.

dh.

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

0

Das hat bei mir funktioniert.

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
                    }

Sie müssen einige Erklärungen zu Ihrem Code abgeben! :)
Sanket Makani

Datei lesen getExternalStorageDirectory + "/ Music /" hinzufügen, es ist der Pfad von mir -> mypath = / storage / sdcard / Music /. Überprüfen Sie, ob eine Datei vorhanden oder nicht vorhanden ist, und lesen Sie sie. löschen, falls vorhanden. Dies ist alle Liste Musik im Verzeichnis Musik löschen
Lâm Nguyễn Tuấn

Fügen Sie das gleiche der Antwort hinzu! :)
Sanket Makani

0

Sie können eine Datei wie folgt löschen:

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

Oder versuchen Sie Folgendes:

String del="/storage/sdcard0/Baahubali.mp3";
File filedel2 = new File(del);
boolean deleted1 = filedel2.delete();

1
Ihre beiden Beispiele sind ziemlich gleich. Auch die Antwort mit der höchsten Stimmenzahl sagt genau dies aus. Ich kann nicht sehen, was diese Antwort noch die Frage hinzufügt. Dies funktioniert auch nicht für Dateien in einem externen Speicher (wie SD-Karte) ab Android Kitkat IIRC
Spikatrix
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.