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.