Example #1
0
 @Nullable
 private boolean deletFile(File file) {
   if (!file.delete()) {
     DocumentFile sdDir = getExternalSdDocumentFile();
     if (sdDir == null) return false;
     String baseS = sdDir.getName();
     String fileFolder = file.getAbsolutePath();
     String[] split = fileFolder.split("/");
     DocumentFile tmpdir = null;
     boolean append = false;
     for (String aSplit : split) {
       if (aSplit.equals(baseS) || append) {
         if (!append) {
           append = true;
           tmpdir = sdDir;
         } else {
           tmpdir = tmpdir.findFile(aSplit);
         }
       }
     }
     boolean d = false;
     d = !(tmpdir != null && tmpdir.exists()) || tmpdir.delete();
     Logger.d("delteDocumentFile", "file delted:" + d);
     return d;
   }
   return true;
 }
  /**
   * Check for a directory if it is possible to create files within this directory, either via
   * normal writing or via Storage Access Framework.
   *
   * @param folder The directory
   * @return true if it is possible to write in this directory.
   */
  public static final boolean isWritableNormalOrSaf(final File folder, Context c) {
    // Verify that this is a directory.
    if (folder == null) return false;
    if (!folder.exists() || !folder.isDirectory()) {
      return false;
    }

    // Find a non-existing file in this directory.
    int i = 0;
    File file;
    do {
      String fileName = "AugendiagnoseDummyFile" + (++i);
      file = new File(folder, fileName);
    } while (file.exists());

    // First check regular writability
    if (isWritable(file)) {
      return true;
    }

    // Next check SAF writability.
    DocumentFile document = getDocumentFile(file, false, c);

    if (document == null) {
      return false;
    }

    // This should have created the file - otherwise something is wrong with access URL.
    boolean result = document.canWrite() && file.exists();

    // Ensure that the dummy file is not remaining.
    document.delete();

    return result;
  }
  /**
   * Delete a file. May be even on external SD card.
   *
   * @param file the file to be deleted.
   * @return True if successfully deleted.
   */
  public static final boolean deleteFile(@NonNull final File file, Context context) {
    // First try the normal deletion.
    boolean fileDelete = deleteFilesInFolder(file, context);
    if (file.delete() || fileDelete) return true;

    // Try with Storage Access Framework.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
        && FileUtil.isOnExtSdCard(file, context)) {

      DocumentFile document = getDocumentFile(file, false, context);
      return document.delete();
    }

    // Try the Kitkat workaround.
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
      ContentResolver resolver = context.getContentResolver();

      try {
        Uri uri = MediaStoreUtil.getUriFromFile(file.getAbsolutePath(), context);
        resolver.delete(uri, null, null);
        return !file.exists();
      } catch (Exception e) {
        Log.e("AmazeFileUtils", "Error when deleting file " + file.getAbsolutePath(), e);
        return false;
      }
    }

    return !file.exists();
  }
  public static boolean rmdir(final File file, Context context) {
    if (file == null) return false;
    if (!file.exists()) {
      return true;
    }
    if (!file.isDirectory()) {
      return false;
    }
    String[] fileList = file.list();
    if (fileList != null && fileList.length > 0) {
      //  empty the folder.
      rmdir1(file, context);
    }
    String[] fileList1 = file.list();
    if (fileList1 != null && fileList1.length > 0) {
      // Delete only empty folder.
      return false;
    }
    // Try the normal way
    if (file.delete()) {
      return true;
    }

    // Try with Storage Access Framework.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      DocumentFile document = getDocumentFile(file, true, context);
      return document.delete();
    }

    // Try the Kitkat workaround.
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
      ContentResolver resolver = context.getContentResolver();
      ContentValues values = new ContentValues();
      values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath());
      resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

      // Delete the created entry, such that content provider will delete the file.
      resolver.delete(
          MediaStore.Files.getContentUri("external"),
          MediaStore.MediaColumns.DATA + "=?",
          new String[] {file.getAbsolutePath()});
    }

    return !file.exists();
  }