Як видалити файл із SD-карти?


131

Я створюю файл для надсилання як вкладення до електронного листа. Тепер я хочу видалити зображення після надсилання електронного листа. Чи є спосіб видалити файл?

Я спробував, myFile.delete();але файл не видалив.


Я використовую цей код для Android, тому мовою програмування є Java, використовуючи звичні способи Android для доступу до SD-карти. Я видаляю файл у onActivityResultметоді, коли Intentповернення на екран повертається на екран після надсилання електронного листа.


Вам потрібно надати додаткову інформацію про проблему, наприклад, якою мовою ви користуєтесь, яким чином ви отримуєте доступ до SD-карти тощо.
Amok

ви промиваєте зміни на диску?
Чарльз

10
@Amuck Я думаю, що можна вважати, що він використовує Java, оскільки він не вказав.
Джеремі Логан

Звучить дуже підозріло, якщо ви запитаєте мене ...
Studocwho

Відповіді:


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

де selectedFilePath - шлях до файлу, який ви хочете видалити - наприклад:

/sdcard/YourCustomDirectory/ExampleFile.mp3


Я думаю, що внутрішні діти не видаляються .. ви повинні видалити всі внутрішні дочі. Дивіться мою відповідь нижче ..
Zar E Ahmer

2
На жаль, це не працюватиме на Android 4.4+. Дивіться мою відповідь нижче.
stevo.mit

Я не розумію, як це працювало для багатьох. "Видалено" виглядає сірим в Android Studio.
TheOnlyAnil

так, я надсилав шлях на зразок "файл: /// зберігання / ...", який не працював
Jemshit Iskenderov

1
@ stevo.mit Ви знайшли рішення? Я також зіткнувся з тією самою проблемою, що не можу видалити файл із sdcard вище Android 4.4+. Але той самий код, що працює для 4.3 /
hasnain_ahmad

79

Також ви повинні дати дозвіл, якщо ви використовуєте> 1.6 SDK

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

у AndroidManifest.xmlфайл


але для зберігання знімних SD-карт вам також потрібноContentResolver
користувач25

35

Змініть для Android 4.4+

Додатки є забороняється для запису (видалення, зміна ...) для зовнішнього зберігання , за винятком їх пакет специфічних каталогів.

Як зазначено в документації на Android:

"Додаток не може дозволяти записувати на вторинні зовнішні пристрої зберігання даних, за винятком специфічних для пакунків каталогів, як це дозволено синтезованими дозволами."

Однак існує неприємне рішення (див. Код нижче) . Тестовано на Samsung Galaxy S4, але це виправлення працює не на всіх пристроях. Також я б не розраховував, що цей спосіб вирішення буде доступний у майбутніх версіях Android.

Є чудова стаття, що пояснює зміну дозволів на зовнішнє зберігання (4.4+) .

Докладніше про обхід можна прочитати тут . Обхідний вихідний код із цього сайту .

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
Не працює для примітки3. Я отримав помилку "MediaProvider: Не вдалося видалити /mnt/extSdCard/test.zip"
iscariot

2
У мене не вкоренився Moto X 4.4.4 і не маю проблем писати в / sdcard / mydirectory
Роб

"На жаль, це не працює більше на новіших версіях Kitkat, все це було заблоковано." цитується від автора "ghisler (Author)"
HendraWD

Android все більше і більше закривається. Ми закінчимось потворною копією iOS !!
Phantômaxx

Для мене це не вдається (Android 7.1). Він завжди повертається falseі не видаляє файл :-(
Spikatrix

18

Android Context має такий спосіб:

public abstract boolean deleteFile (String name)

Я вірю, що це зробить все, що ви хочете, з правильними припущеннями додатків, як зазначено вище.


3
Це має бути правильна відповідь. context.deleteFile(filename);
Лізандро

11

Рекурсивно видалити всі діти з файлу ...

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

    fileOrDirectory.delete();
}

9

Це для мене працює: (Видалити зображення з Галереї)

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

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

2
Що робить контекст.sendBroadcast ()?
Мегаетрон

В основному, він надсилає / транслює наміри (операцію, яку слід виконати) всім приймачам, що відповідають цьому Наметі. посилання
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());
 }

Цей код допоможе вам. І в Android Manifest вам потрібно отримати дозвіл на внесення змін ..

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

Файли [] можуть бути нульовими, якщо:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ilw

Напевно, ви, хлопці, абсолютно не знаєте, що деякі андроїд-телефони обмежують доступ для запису до sd-карт.


1

Вибачте: раніше у моєму коді сталася помилка через перевірку сайту.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

Я думаю, що це зрозуміло ... Спочатку ви повинні знати своє місцезнаходження. По-друге ,,, Environment.getExternalStorageDirectory()це метод, який отримує ваш каталог додатків. Нарешті, файл класу, який обробляє ваш файл ...


1

У мене була схожа проблема з додатком, який працює на 4.4. Те, що я зробив, було свого роду злом.

Я перейменував файли і проігнорував їх у своїй програмі.

тобто.

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

0

Це працювало для мене.

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
                    }

Вам потрібно надати пояснення щодо свого коду! :)
Sanket Makani

Прочитайте файл getExternalStorageDirectory + додайте "/ Музика /" це шлях від мене -> mypath = / storage / sdcard / Music /. Перевірте, чи існує файл чи немає, і прочитайте його. видалити, якщо вони існують. Це видалити всю музику зі списку в каталозі Музика
Lâm Nguyễn Tuấn

Додайте те саме до відповіді! :)
Санкет Макані

0

Ви можете видалити файл наступним чином:

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

Або спробуйте це:

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

1
Обидва ваші приклади майже однакові. Крім того, відповідь, яка найбільше голосує, говорить саме про це. Не бачу, що ще відповідь додає питання. Крім того, це не працюватиме для файлів у зовнішньому сховищі (наприклад, SD-карта) від Android Kitkat далі IIRC
Spikatrix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.