SD karttan dosya nasıl silinir?


131

Bir e-postaya ek olarak göndermek için bir dosya oluşturuyorum. Şimdi e-postayı gönderdikten sonra resmi silmek istiyorum. Dosyayı silmenin bir yolu var mı?

Denedim myFile.delete();ama dosyayı silmedim.


Bu kodu Android için kullanıyorum, bu nedenle programlama dili, SD karta erişmek için normal Android yöntemlerini kullanan Java'dır. Bir e-posta gönderdikten sonra ekrana onActivityResultbir Intentdöndüğünde , yöntemdeki dosyayı siliyorum .


Hangi dili kullandığınız, SD karta nasıl eriştiğiniz vb. Gibi sorunla ilgili daha fazla bilgi sağlamanız gerekir
Amok

değişiklikleri diske aktarıyor musunuz?
Charles Ma

10
@Amuck, belirtmediği için Java kullandığını varsaymanın güvenli olduğunu düşünüyorum.
Jeremy Logan

Bana sorarsan
kulağa

Yanıtlar:


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

burada selectedFilePath silmek istediğiniz dosyanın yoludur - örneğin:

/sdcard/YourCustomDirectory/ExampleFile.mp3


Bence iç çocuklar silinmedi .. tüm iç çocukları silmelisin.Aşağıdaki cevabıma bakın ..
Zar E Ahmer

2
Maalesef bu, Android 4.4+ üzerinde çalışmayacak. Aşağıdaki cevabıma bakın.
stevo.mit

Bunun birçokları için nasıl çalıştığını anlamıyorum. Android Studio'da "silindi" gri renkte görünüyor.
TheOnlyAnil

evet, işe yaramayan "file: /// storage / ..." gibi bir yol gönderiyordum
Jemshit Iskenderov

1
@ stevo.mit çözümü buldunuz mu? Aynı sorunla karşılaşıyorum, Android 4.4+ üzerindeki sdcard'dan dosya silemiyorum. Ama aynı kod 4.3 /
hasnain_ahmad

79

Ayrıca> 1.6 SDK kullanıyorsanız izin vermelisiniz

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

içinde AndroidManifest.xmldosyanın


ancak çıkarılabilir SD Kart depolaması için de ihtiyacınız varContentResolver
kullanıcı25

35

Android 4.4+ için değişiklik

Uygulamalar edilir izin verilmeyen için yazma (... değiştirme, silme) için harici depolama dışında kendi için paket özgü dizinleri.

Android belgelerinde belirtildiği gibi:

"Uygulamaların, sentezlenmiş izinlerin izin verdiği pakete özgü dizinleri dışında ikincil harici depolama cihazlarına yazmasına izin verilmemelidir."

Ancak, kötü bir geçici çözüm mevcuttur (aşağıdaki koda bakın) . Samsung Galaxy S4'te test edildi, ancak bu düzeltme tüm cihazlarda çalışmıyor. Ayrıca bu geçici çözümün Android'in gelecekteki sürümlerinde mevcut olacağına da güvenmem .

Bir yoktur (4.4+) harici depolama izinleri değişikliği açıklayan harika makale .

Geçici çözüm hakkında daha fazla bilgiyi buradan okuyabilirsiniz . Geçici çözüm kaynak kodu bu siteden .

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
Note3 için çalışmıyor. "MediaProvider: /mnt/extSdCard/test.zip silinemedi" hatası aldım
iscariot

2
4.4.4'te köklenmemiş bir Moto X'im var ve / sdcard / dizinime yazarken sorun yaşamıyorum
Rob

"Maalesef artık Kitkat'ın yeni sürümlerinde çalışmıyor, hepsi kilitlendi." "ghisler (Yazar)" yazarından alıntı
HendraWD

Android giderek kendini kapatıyor. Sonunda çirkin bir iOS kopyası elde edeceğiz !!
Phantômaxx

Bu benim için başarısız oluyor (Android 7.1). Her zaman döndürür falseve şu dosyayı silmez :-(
Spikatrix

18

Android Context aşağıdaki yönteme sahiptir:

public abstract boolean deleteFile (String name)

Bunun, yukarıda listelenen doğru Uygulama tesisleriyle istediğinizi yapacağına inanıyorum.


3
Bu doğru cevap olmalı. context.deleteFile(filename);
Lisandro

11

Dosyanın tüm alt öğelerini yinelemeli olarak silin ...

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

    fileOrDirectory.delete();
}

9

Bu benim için çalışıyor: (Resmi Galeriden sil)

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

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

2
Context.sendBroadcast () ne yapar?
Megaetron

Temel olarak, amacı (gerçekleştirilecek işlem) bu Niyete uyan tüm alıcılara gönderir / yayınlar. bağlantı
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());
 }

Bu Kod Size Yardımcı Olacaktır .. Ve Android Manifest'te değişiklik yapmak için İzin Almalısınız ..

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

dosyalar [] şu durumlarda boş olabilir:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw

Sanırım sizler bazı android telefonların SD kartlara yazma erişimini kısıtladığının tamamen farkında değilsiniz.

4

Bunu dene.

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

Apache Commons'tan


1

Üzgünüm: Kodumda site doğrulaması nedeniyle daha önce bir hata var.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

Sanırım açık ... Öncelikle dosya konumunuzu bilmelisiniz. İkincisi ,,, Environment.getExternalStorageDirectory()uygulama dizininizi alan bir yöntemdir. Son olarak, dosyanızı işleyen sınıf dosyası ...


1

4.4'te çalışan bir uygulamayla benzer bir sorun yaşadım. Yaptığım şey bir çeşit hack'ti.

Dosyaları yeniden adlandırdım ve uygulamamda yok saydım.

yani.

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

0

Bu benim için çalıştı.

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
                    }

Kodunuz hakkında bazı açıklamalar sağlamanız gerekiyor! :)
Sanket Makani

GetExternalStorageDirectory dosyasını oku + "/ Music /" ekle bu benim yolum -> mypath = / storage / sdcard / Music /. Dosyanın var olup olmadığını kontrol edin ve okuyun. varsa silin. Bu müzik dizinindeki tüm müzik listelerini sil
Lâm Nguyenễn Tuấn

Aynısını yanıta ekleyin! :)
Sanket Makani

0

Bir dosyayı aşağıdaki şekilde silebilirsiniz:

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

Veya Şunu Deneyin:

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

1
Her iki örneğiniz de hemen hemen aynı. Ayrıca, en yüksek oyu alan cevap tam olarak bunu yapmasını söyler. Bu cevabın soruyu daha ne eklediğini göremiyorum. Ayrıca, bu, Android
Kitkat'tan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.