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.


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


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


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; 
   } 
}

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.


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

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

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"/>

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


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 ...


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

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

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
                    }

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.