2015-09-27 4 views
0

Я смотрю приложение Android для организации и очистки своего телефона, и первое, что я начинаю делать, это «Очистить пустые папки», я подумал, что это будет легко, и на самом деле его легко , но я хочу пойти дальше ...Удалить алгоритм с пустыми папками

Ccleaner, например, только поиск пустых папок, это означает, что если есть папка с пустой папкой внутри или около того, вам нужно будет использовать ее 2 раза , потому что папка, содержащая пустую папку, будет пустой после очистки, с моим кодом я проверяю, есть ли в папке только пустые папки внутри, и она работает для простых случаев, таких как папка с двумя пустыми папками внутри, но когда ее более глубокая , он не работает должным образом.

Я хочу знать, является ли папка пустой и если папка безопасна для удаления, поскольку она содержит только пустые папки.

Если у меня есть папка с папкой внутри выход это один:

Empty Folder: /storage/emulated/0/Folder1/Folder2 
Folder safe to remove (only empty folders inside):/storage/emulated/0/Folder1 

Но с 3 ...

Empty Folder: /storage/emulated/0/Folder1/Folder2/Folder3 
Folder safe to remove (only empty folders inside): /storage/emulated/0/Folder1/Folder2 

Игнорирует первый (Folder1)

Вот способ:

private void getAllEmptyFoldersOfDir(File directory) { 
    //Log.d(TAG, "Folder: " + directory.getAbsolutePath() + "\n"); 
    int emptyFoldersCount = 0; 
    final File[] files = directory.listFiles(); 
    if (files != null) { 
     for (File file : files) { 
      if (file != null) { 
       if (file.getName().equals("Android") && file.isDirectory()) { 
        //We need to exclude this folder 
        continue; 
       } 
       if (file.isDirectory()) { 
        if (file.listFiles().length > 0) { 
         getAllEmptyFoldersOfDir(file); 
         continue; 
        } 
        emptyFoldersCount++; 
        Log.d(TAG, "Empty Folder: " + file.getAbsolutePath() + "\n"); 
       } 
      } 
     } 
     if (files.length == emptyFoldersCount) 
      Log.d(TAG, "Folder safe to remove (only empty folders inside): " + directory.getAbsolutePath() + "\n"); 
    } 

} 

Любая помощь приветствуется, и мой английский не очень хорош, поэтому любое редактирование тоже оценено!

ответ

1

Это то, что я придумал:

boolean getAllEmptyFoldersOfDir(File current){ 
    if(current.isDirectory()){ 
     File[] files = current.listFiles(); 
     if(files.length == 0){ //There is no file in this folder - safe to delete 
      System.out.println("Safe to delete - empty folder: " + current.getAbsolutePath()); 
      return true; 
     } else { 
      int totalFolderCount = 0; 
      int emptyFolderCount = 0; 
      for(File f : files){ 
       if(f.isDirectory()){ 
        totalFolderCount++; 
        if(getAllEmptyFoldersOfDir(f)){ //safe to delete 
         emptyFolderCount++; 
        } 
       } 

      } 
      if(totalFolderCount == files.length && emptyFolderCount == totalFolderCount){ //only if all folders are safe to delete then this folder is also safe to delete 
       System.out.println("Safe to delete - all subfolders are empty: " + current.getAbsolutePath()); 
       return true; 
      } 
     } 
    } 
    return false; 
} 

Всякий раз, когда папка безопасно удалить, этот метод возвращает истину. Поэтому всякий раз, когда вы выполняете рекурсивный вызов, сначала все подпапки проверяются и проверяются, что они пусты. Только если все подпапки пусты (emptyFolderCount == totalFolderCount), сама папка безопасна для удаления.

+1

Спасибо, но, 1, он не работает (он говорит, что все папки безопасны для удаления), и 2, я хочу знать, является ли папка пустой и если папка безопасна для удаления, поскольку она имеет только пустые папки, я обновлю свой вопрос. –

+0

мы можем достичь «из какой папки безопасно удалять» в этом методе? например, если я дам вам путь к моему каталогу, а затем сканирую один раз, когда метод может решить, можно ли удалить всю папку, которую невозможно удалить, и которая не может быть удалена. – dex

+0

Ах, сделав небольшую ошибку, пришлось сделать дополнительную проверку, чтобы убедиться, что папка может содержать файлы, а также папки. Отредактировал ответ. Этот метод выводит все папки, которые можно безопасно удалить, и это был вопрос, который был задан здесь правильно? –

Смежные вопросы