Bagaimana cara menghapus file dari kartu SD?

131

Saya membuat file untuk dikirim sebagai lampiran email. Sekarang saya ingin menghapus gambar setelah mengirim email. Apakah ada cara untuk menghapus file?

Saya sudah mencoba myFile.delete();tetapi tidak menghapus file.


Saya menggunakan kode ini untuk Android, jadi bahasa pemrograman Java menggunakan cara Android yang biasa untuk mengakses kartu SD. Saya menghapus file dalam onActivityResultmetode ini, ketika sebuah Intentdikembalikan ke layar setelah mengirim email.

mudit
sumber
Anda perlu memberikan informasi lebih lanjut tentang masalah tersebut, seperti bahasa yang Anda gunakan, bagaimana Anda mengakses kartu SD, dll.
Amok
Apakah Anda membilas perubahan ke disk?
Charles Ma
10
@ Aduh, saya pikir aman untuk menganggap dia menggunakan Java karena dia tidak menentukan.
Jeremy Logan
Kedengarannya sangat mencurigakan jika kau bertanya padaku ...
Studocwho

Jawaban:

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

di mana selectedFilePath adalah jalur file yang ingin Anda hapus - misalnya:

/sdcard/YourCustomDirectory/ExampleFile.mp3

Niko Gamulin
sumber
Saya pikir anak-anak batin tidak dihapus .. Anda harus menghapus semua anak batin. Lihat jawaban saya di bawah ini ..
Zar E Ahmer
2
Sayangnya ini tidak akan berfungsi di Android 4.4+. Lihat jawaban saya di bawah ini.
stevo.mit
Saya tidak mengerti bagaimana ini bekerja untuk banyak orang. "dihapus" terlihat abu-abu di Android Studio.
TheOnlyAnil
ya saya mengirim jalur seperti "file: /// storage / ..." yang tidak berfungsi
Jemshit Iskenderov
1
@ stevo.mit apakah Anda menemukan solusinya? Saya juga menghadapi masalah yang sama tidak dapat menghapus file dari sdcard di atas Android 4.4+. Tetapi kode yang sama bekerja untuk 4.3 /
hasnain_ahmad
79

Anda juga harus memberi izin jika Anda menggunakan> 1,6 SDK

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

dalam AndroidManifest.xmlfile

neeloor2004
sumber
tetapi untuk penyimpanan SD Card yang dapat dilepas, Anda juga perluContentResolver
user25
35

Ubah untuk Android 4.4+

Aplikasi tidak diperbolehkan untuk menulis (menghapus, memodifikasi ...) ke penyimpanan eksternal kecuali ke direktori khusus paket mereka .

Seperti yang dinyatakan oleh dokumentasi Android:

"Aplikasi tidak boleh diizinkan untuk menulis ke perangkat penyimpanan eksternal sekunder, kecuali dalam direktori khusus paket mereka sebagaimana diizinkan oleh izin yang disintesis."

Namun ada solusi buruk (lihat kode di bawah) . Diuji pada Samsung Galaxy S4, tetapi perbaikan ini tidak bekerja pada semua perangkat. Juga saya tidak akan mengandalkan solusi yang tersedia di Android versi mendatang .

Ada artikel bagus yang menjelaskan (4.4+) perubahan izin penyimpanan eksternal .

Anda dapat membaca lebih lanjut tentang solusinya di sini . Kode sumber penyelesaian adalah dari situs ini .

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
sumber
1
Tidak berfungsi untuk note3. Saya mendapat kesalahan "MediaProvider: Tidak dapat menghapus /mnt/extSdCard/test.zip"
iscariot
2
Saya memiliki Moto X tanpa akar di 4.4.4 dan tidak punya masalah menulis ke / sdcard / mydirectory
Rob
"Sayangnya itu tidak berfungsi lagi pada versi Kitkat yang lebih baru, semuanya telah dikunci." dikutip dari penulis "ghisler (Penulis)"
HendraWD
Android semakin dekat sendiri. Kami akan berakhir dengan salinan iOS yang jelek !!
Phantômaxx
Ini gagal untuk saya (Android 7.1). Selalu kembali falsedan tidak menghapus file :-(
Spikatrix
18

Android Context memiliki metode berikut:

public abstract boolean deleteFile (String name)

Saya percaya ini akan melakukan apa yang Anda inginkan dengan premis App yang tepat seperti yang tercantum di atas.

Yossi
sumber
3
Ini seharusnya jawaban yang benar. context.deleteFile(filename);
Lisandro
11

Hapus semua anak file secara rekursif ...

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

    fileOrDirectory.delete();
}
Zar E Ahmer
sumber
9

Ini berfungsi untuk saya: (Hapus gambar dari Galeri)

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
Jiyeh
sumber
2
Apa yang dilakukan context.sendBroadcast ()?
Megaetron
Pada dasarnya, ia mengirimkan / menyiarkan maksud (operasi yang akan dilakukan) ke semua penerima yang cocok dengan Intent ini. tautan
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());
 }

Kode ini akan membantu Anda .. Dan dalam Manifes Android Anda harus mendapatkan Izin untuk membuat modifikasi ..

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Vivek Elangovan
sumber
file [] dapat menjadi nol jika:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw
Saya kira kalian sama sekali tidak menyadari bahwa beberapa ponsel android membatasi akses tulis ke kartu sd.
4

Coba ini.

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

dari Apache Commons

Rahul Giradkar
sumber
1

Maaf: Ada kesalahan dalam kode saya sebelumnya karena validasi situs.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

Saya pikir sudah jelas ... Pertama, Anda harus tahu lokasi file Anda. Kedua ,,, Environment.getExternalStorageDirectory()adalah metode yang mendapatkan direktori aplikasi Anda. Terakhir File kelas yang menangani file Anda ...

Denis IJCU
sumber
1

Saya memiliki masalah serupa dengan aplikasi yang berjalan pada 4.4. Apa yang saya lakukan adalah semacam peretasan.

Saya mengganti nama file dan mengabaikannya di aplikasi saya.

yaitu.

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

Ini berhasil untuk saya.

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

String my_Path = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(my_Path);
Boolean deleted = f.delete();
Denis IJCU
sumber
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
sumber
Anda perlu memberikan beberapa penjelasan tentang kode Anda! :)
Sanket Makani
Baca file getExternalStorageDirectory + tambahkan "/ Musik /" itu path saya -> mypath = / storage / sdcard / Music /. Periksa file ada atau tidak ada dan baca. hapus jika ada. Ini menghapus semua daftar musik dalam direktori Musik
Lâm Nguyễn Tuấn
Tambahkan hal yang sama ke jawabannya! :)
Sanket Makani
0

Anda dapat menghapus file sebagai berikut:

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
sumber
-1
File filedel = new File("/storage/sdcard0/Baahubali.mp3");
boolean deleted1 = filedel.delete();

Atau, Coba Ini:

String del="/storage/sdcard0/Baahubali.mp3";
File filedel2 = new File(del);
boolean deleted1 = filedel2.delete();
Laxman Ghuge
sumber
1
Kedua contoh Anda hampir sama. Juga, jawaban dengan suara tertinggi mengatakan dengan tepat untuk melakukan ini. Tidak dapat melihat apa lagi jawaban ini menambahkan pertanyaan. Juga, ini tidak akan berfungsi untuk file dalam penyimpanan eksternal (seperti kartu SD) dari Android Kitkat dan seterusnya IIRC
Spikatrix