Datei aus dem internen Speicher löschen

95

Ich versuche, im internen Speicher gespeicherte Bilder zu löschen. Ich habe mir das bisher ausgedacht:

File dir = getFilesDir();
File file = new File(dir, id+".jpg");
boolean deleted = file.delete();

Und dies ist aus einer anderen Frage, die beantwortet wurde mit :

File dir = getFilesDir();
File file = new File(dir, "my_filename");
boolean deleted = file.delete();

Mein Beispiel gibt immer false zurück. Ich kann die Datei fx 2930.jpgin DDMS in Eclipse sehen.

Crunch
quelle

Antworten:

139

Das hat getFilesDir()irgendwie nicht funktioniert. Die Verwendung einer Methode, die den gesamten Pfad und Dateinamen zurückgibt, ergab das gewünschte Ergebnis. Hier ist der Code:

File file = new File(inputHandle.getImgPath(id));
boolean deleted = file.delete();
Crunch
quelle
Wo inputHandle.getImgPath(id)ist filePath
Pratik Butani
45

Haben Sie Context.deleteFile () ausprobiert ?

Konstantin Burov
quelle
Versuchte eine Variante mit Contex.deletFile (), die nicht funktionierte. Unten scheint zu funktionieren.
Crunch
@ user661543 Was ist der vollständige Pfad, der von ih.getImgPath () zurückgegeben wird? Was haben Sie als Argument zum Löschen einer Datei übergeben? Wenn die oben beschriebene Methode nicht funktioniert hat, wurde Ihre Datei höchstwahrscheinlich außerhalb des Anwendungspakets gespeichert. Oder Sie haben möglicherweise einen falschen Dateinamen als Argument übergeben.
Konstantin Burov
+1 Es ist der einfachste Weg, Dateien zu entfernen, die übernew OutputStreamWriter(context.openFileOutput(fileName, Context.MODE_PRIVATE)).write(data);
Eugen
18

Das funktioniert bei mir:

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
Jiyeh
quelle
14
String dir = getFilesDir().getAbsolutePath();
File f0 = new File(dir, "myFile");
boolean d0 = f0.delete(); 
Log.w("Delete Check", "File deleted: " + dir + "/myFile " + d0);

Der Code File dir = getFilesDir();funktioniert nicht, da dies eine Anforderung für ein Dateiobjekt ist. Sie versuchen, den String abzurufen, der den Pfad zu Ihrem Verzeichnis deklariert. Daher müssen Sie 'dir' als String deklarieren und dann anfordern, dass der Konstruktor, der Zugriff auf diese Informationen hat, den absoluten Pfad des Verzeichnisses in String-Form zurückgibt .

VikingGlen
quelle
10

Sie können auch verwenden: file.getCanonicalFile().delete();

mvsjes2
quelle
2

Hast du es versucht getFilesDir().getAbsolutePath()?

Anscheinend haben Sie Ihr Problem behoben, indem Sie das Dateiobjekt mit einem vollständigen Pfad initialisiert haben. Ich glaube, das würde auch den Trick machen.

Ronnie
quelle
0

Dies ist ein altes Thema, aber ich werde meine Erfahrung hinzufügen, vielleicht findet jemand dies hilfreich

>     2019-11-12 20:05:50.178 27764-27764/com.strba.myapplicationx I/File: /storage/emulated/0/Android/data/com.strba.myapplicationx/files/Readings/JPEG_20191112_200550_4444350520538787768.jpg//file when it was created

2019-11-12 20:05:58.801 27764-27764/com.strba.myapplicationx I/File: content://com.strba.myapplicationx.fileprovider/my_images/JPEG_20191112_200550_4444350520538787768.jpg //same file when trying to delete it

Lösung1:

              Uri uriDelete=Uri.parse (adapter.getNoteAt (viewHolder.getAdapterPosition ()).getImageuri ());//getter getImageuri on my object from adapter that returns String with content uri

Hier initialisiere ich den Content Resolver und lösche ihn mit einem übergebenen Parameter dieses URI

            ContentResolver contentResolver = getContentResolver ();
            contentResolver.delete (uriDelete,null ,null );

Lösung2 (meine erste Lösung von Kopf in dieser Zeit weiß ich das): Content Resolver existiert ...

              String path = "/storage/emulated/0/Android/data/com.strba.myapplicationx/files/Readings/" +
                    adapter.getNoteAt (viewHolder.getAdapterPosition ()).getImageuri ().substring (58);

            File file = new File (path);
            if (file != null) {
                file.delete ();
            }

Hoffe, dass dies für jemanden hilfreich sein wird, der gerne codiert

Nenad Štrbić
quelle
0
File file = new File(getFilePath(imageUri.getValue())); 
boolean b = file.delete();

funktioniert in meinem Fall nicht.

boolean b = file.delete();                 // returns false
boolean b = file.getAbsolutePath.delete(); // returns false 

gibt immer false zurück.

Das Problem wurde mithilfe des folgenden Codes behoben:

ContentResolver contentResolver = getContentResolver();
contentResolver.delete(uriDelete, null, null);
Vishakha
quelle