Как удалить файл с SD-карты?


131

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

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


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


Вам необходимо предоставить дополнительную информацию о проблеме, например, какой язык вы используете, как вы получаете доступ к SD-карте и т. Д.
Амок,

вы сбрасываете изменения на диск?
Чарльз Ма

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

Звучит очень подозрительно, если вы спросите меня ...
Studocwho

Ответы:


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

где selectedFilePath - это путь к файлу, который вы хотите удалить, например:

/sdcard/YourCustomDirectory/ExampleFile.mp3


Я думаю, что внутренние дочерние элементы не удаляются .. вы должны удалить все внутренние дочерние элементы. См. Мой ответ ниже ..
Зар Э Ахмер

2
К сожалению, это не будет работать на Android 4.4+. Смотрите мой ответ ниже.
stevo.mit

Я не понимаю, как это сработало для многих. "удаленный" в Android Studio отображается серым цветом.
TheOnlyAnil

да, я отправлял путь типа «файл: /// хранилище / ...», который не работал
Джемшит Искендеров

1
@ stevo.mit вы нашли решение? Я также сталкиваюсь с той же проблемой, что не могу удалить файл с SD-карты выше Android 4.4+. Но тот же код работает для 4.3 /
hasnain_ahmad

79

Также вы должны дать разрешение, если вы используете> 1.6 SDK

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

в AndroidManifest.xmlфайле


но для съемного хранилища SD Card вам также понадобитсяContentResolver
user25

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
Не работает для note3. У меня ошибка «MediaProvider: не удалось удалить /mnt/extSdCard/test.zip»
iscariot 02

2
У меня нерутированный Moto X на 4.4.4, и у меня нет проблем с записью в / sdcard / mydirectory
Роб

«К сожалению, он больше не работает в новых версиях Kitkat, все заблокировано». цитируется автором "ghisler (Автор)"
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
Что делает context.sendBroadcast ()?
Megaetron

По сути, он отправляет / транслирует намерение (операцию, которая должна быть выполнена) всем получателям, соответствующим этому намерению. ссылка
Jiyeh 01

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
САО

Думаю, вы, ребята, совершенно не подозреваете, что некоторые телефоны Android ограничивают доступ на запись к SD-картам.


1

Извините: в моем коде раньше была ошибка из-за проверки сайта.

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

Думаю, ясно ... Сначала вы должны знать, где находится ваш файл. Во-вторых, Environment.getExternalStorageDirectory()это метод, который получает каталог вашего приложения. Наконец, класс File, который обрабатывает ваш файл ...


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
                    }

Вам нужно дать объяснение по поводу вашего кода! :)
Санкет Макани

Прочтите файл getExternalStorageDirectory + добавьте "/ Music /", это мой путь -> mypath = / storage / sdcard / Music /. Убедитесь, что файл существует или не существует, и прочтите его. удалить, если есть. Это удаление всего списка музыки в каталоге Музыка
Лам Нгуен

Добавьте то же самое к ответу! :)
Санкет Макани

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 и
новее
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.