Как удалить файл из хранилища, используя путь к файлу? - PullRequest
0 голосов
/ 13 марта 2019

Я работаю над приложением, в котором перечислены все аудиофайлы из общего внутреннего хранилища и съемной 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 КБ.

In Download Nav box

Nav drawer

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

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

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

Ответы [ 4 ]

1 голос
/ 13 марта 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;
        }
1 голос
/ 13 марта 2019

Эта часть может работать.

Files.deleteIfExists(Paths.get("C:\\Users\\Mayank\\Desktop\\ 
        445.mp3"));
1 голос
/ 13 марта 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();
        }
1 голос
/ 13 марта 2019

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

FileUtils.forceDelete(FileUtils.getFile(s.getFilepath()));
...