Как удалить файл из хранилища, используя путь к файлу?

Я работаю над приложением, в котором перечислены все аудиофайлы из общего внутреннего хранилища и съемной SD-карты. Теперь, если пользователь хочет удалить определенный файл, он будет удален из общего внутреннего хранилища или съемной SD-карты.

Проблема, с которой я столкнулся, заключается в том, что file.delete не работает, я использовал mediastore для получения всех аудиофайлов.

Это были пути к аудиофайлам, которые я получил из медиа-магазина.

Это из внутреннего общего хранилища.

/storage/emulated/0/Music/Guitar1.mp3

Это со съемной карты micro SD.

/storage/BBF8-A8D3/Guitar1.mp3

После получения этих путей

  File deleteFile = new File(s.getFilepath());
  boolean delete = deleteFile.delete();

Удаление дает false, так как файл удаления не удаляется.

Теперь я попробовал это,

    File deleteFile = new File(s.getFilepath());
    if(deleteFile.exists()) {
    boolean catchdelete = deleteFile.delete();}

Теперь, после создания файла из пути, если условие не выполняется, поскольку файл удаления не существует.

Итак, почему вновь созданный файл не существует (файл не является каталогом), требуется ли поток ввода файла.

Моя основная проблема - удалить файл из хранилища через приложение.

Это мой метод получения путей к аудиофайлам.

public ArrayList<String> getAudiosPath(Activity activity, Context context) {
            //  Uri uri;
            listOfAllAudios = new ArrayList<String>();
            Cursor cursor;

            final String[] columns = {MediaStore.Audio.Media.DATA, MediaStore.Audio.Media._ID};
            final String orderBy = MediaStore.Audio.Media._ID;
            //Stores all the audio from the gallery in Cursor
            cursor = getContentResolver().query(
                    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns, null,
                    null, orderBy);
            //Total number of audios
            int count = cursor.getCount();

            //Create an array to store path to all the audios
            String[] arrPath = new String[count];

            for (int i = 0; i < count; i++) {
                cursor.moveToPosition(i);
                int dataColumnIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);

                //Store the path of the audio
                arrPath[i] = cursor.getString(dataColumnIndex);
                Bitmap b = ((BitmapDrawable) ResourcesCompat.getDrawable(context.getResources(), R.drawable.headphone512, null)).getBitmap();

                bitmap.add(b);
                Log.i("PATH", arrPath[i]);
                listOfAllAudios.add(arrPath[i]);
            }

            //  count_paths=listOfAllAudios.size();

            return listOfAllAudios;
        }

Теперь я применил утилиты Apache Commons IO File Utils.

 File deleteFile = new File(s.getFilepath());
     // boolean delete = deleteFile.delete();
      try {
          FileUtils.forceDelete(FileUtils.getFile(s.getFilepath()));
        } 
    catch (IOException e) {
                  e.printStackTrace();
        }

Эта файловая утилита Apache Commons действительно удаляет файл, но проблема заключается в том, что при повторном открытии приложения я вижу путь к файлу с размером файла 0 КБ.

В ящике загрузки навигации

Ящик навигации

когда в ящике навигации я получаю доступ к TA-1032-> Музыка -> Пусто (файл отсутствует) (файл отсутствует, что означает, что файл удаляется)

Но в ящике Nav я получаю доступ к Audio-> Unknown -> Music -> Guitar.mp3 (файл присутствует, но размер файла равен 0 и не может быть воспроизведен)

так что это как-то получить путь к файлу.


person A-J    schedule 13.03.2019    source источник


Ответы (4)


Попробуйте использовать Apache Commons в качестве зависимости и используйте их файловый API для операции.

FileUtils.forceDelete(FileUtils.getFile(s.getFilepath()));
person dammina    schedule 13.03.2019
comment
я попытался использовать FileUtils с try catch, и он говорит, что файл не найден. Хотя путь, который я получаю, исходит от file.getAbsolutepath(); который дает правильный путь от хранилища. - person A-J; 13.03.2019

Эта штука может сработать.

Files.deleteIfExists(Paths.get("C:\\Users\\Mayank\\Desktop\\ 
        445.mp3"));
person darecoder    schedule 13.03.2019

Фрагмент кода будет полезен

File directory = new File("c:\\directoryname\\filename.txt");-- give your path where file is located.

        try {

            FileUtils.forceDelete(directory);

            System.out.println("force delete file in java");

        } 
        catch (IOException e) {
            e.printStackTrace();
        }
person Lova Chittumuri    schedule 13.03.2019

Это сработало для меня, код, опубликованный @dammina, удалил файл, но все еще был доступен из медиа-магазина, поэтому об этом позаботится другой метод.

     File deleteFile = new File(s.getFilepaths());

   try {                                               
      FileUtils.forceDelete(FileUtils.getFile(s.getFilepaths()));                                             
       //   adapterRecycler.notifyDataChanged();                                              
         adapterRecycler.notifyDataChanged(sectionHeaders);
                                            }
         catch (IOException e) {
                e.printStackTrace();
                }


 deleteFileFromMediaStore(getContentResolver(), deleteFile);

метод удаления из хранилища мультимедиа, поскольку даже после удаления файла он по-прежнему доступен через хранилище мультимедиа.

public static int deleteFileFromMediaStore(final ContentResolver contentResolver, final File file) {
            String canonicalPath;
            try {
                canonicalPath = file.getCanonicalPath();
            } catch (IOException e) {
                canonicalPath = file.getAbsolutePath();
            }
           // MediaStore.Files.FileColumns.DATA
            final Uri uri = MediaStore.Files.getContentUri("external");
            final int result = contentResolver.delete(uri,
                    MediaStore.Audio.Media.DATA + "=?", new String[]{canonicalPath});
            if (result == 0) {
                final String absolutePath = file.getAbsolutePath();
                if (!absolutePath.equals(canonicalPath)) {
                    int deletedRow = contentResolver.delete(uri,
                            MediaStore.Audio.Media.DATA + "=?", new String[]{absolutePath});
                    return deletedRow;
                }
            } else return result;
            return result;
        }
person A-J    schedule 13.03.2019