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.

Schlamm
quelle
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

Niko Gamulin
quelle
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

neeloor2004
quelle
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; 
   } 
}
stevo.mit
quelle
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.

Yossi
quelle
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();
}
Zar E Ahmer
quelle
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))));
Jiyeh
quelle
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"/>
Vivek Elangovan
quelle
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

Rahul Giradkar
quelle
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 ...

Denis IJCU
quelle
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);
km
quelle
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();
Denis IJCU
quelle
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
quelle
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());
  }
}
Makvin
quelle
-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();
Laxman Ghuge
quelle
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