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

131

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

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


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

mudit
источник
Вам необходимо предоставить дополнительную информацию о проблеме, например, какой язык вы используете, как вы получаете доступ к 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файле

neeloor2004
источник
но для съемного хранилища 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; 
   } 
}
stevo.mit
источник
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();
}
Zar E Ahmer
источник
9

Это работает для меня: (Удалить изображение из галереи)

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
Jiyeh
источник
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-картам.
4

Попробуй это.

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

из Apache Commons

Рахул Гирадкар
источник
1

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

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

String myPath = Environment.getExternalStorageDirectory()+myFile;  

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

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

Денис IJCU
источник
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();
Денис IJCU
источник
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());
  }
}
Makvin
источник
-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 и
новее