Как удалить все файлы и папки в одной папке на Android
Я использую этот код для удаления всех файлов:
File root = new File("root path");
File[] Files = root.listFiles();
if(Files != null) {
int j;
for(j = 0; j < Files.length; j++) {
System.out.println(Files[j].getAbsolutePath());
System.out.println(Files[j].delete());
}
}
Он удалит false, где Files[j]
- это папка.
Я хочу удалить папку и все ее файлы.
Как я могу это изменить?
Ответы
Ответ 1
Простейшим способом было бы использовать FileUtils.deleteDirectory из библиотеки ввода-вывода Apache Commons.
File dir = new File("root path");
FileUtils.deleteDirectory(dir);
Помните, что это также удалит содержащую директорию.
Добавьте эту строку в файл gradle, чтобы иметь Apache
compile 'org.apache.commons:commons-io:1.3.2'
Ответ 2
Проверьте эту ссылку также Удалить папку из внутреннего хранилища в Android?.
void deleteRecursive(File fileOrDirectory) {
if (fileOrDirectory.isDirectory())
for (File child : fileOrDirectory.listFiles())
deleteRecursive(child);
fileOrDirectory.delete();
}
Ответ 3
File file = new File("C:\\A\\B");
String[] myFiles;
myFiles = file.list();
for (int i=0; i<myFiles.length; i++) {
File myFile = new File(file, myFiles[i]);
myFile.delete();
}
B.delete();// deleting directory.
Вы можете написать метод следующим образом: Удаляет все файлы и подкаталоги в каталоге dir.Returns true, если все удаления были успешными. Если удаление не удалось, метод перестает пытаться удалить и возвращает false.
public static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// The directory is now empty so delete it
return dir.delete();
}
Ответ 4
если storageDir - это каталог
for(File tempFile : storageDir.listFiles()) {
tempFile.delete();
}
Ответ 5
Вы можете проверить следующее:
for(j = 0; j < Files.length; j++) {
if(file.isDirectory()){
for(File f : file.listFiles()){
System.out.println(Files[j].getAbsolutePath());
System.out.println(Files[j].delete());
}
else {
System.out.println(Files[j].getAbsolutePath());
System.out.println(Files[j].delete());
}
}
Ответ 6
вы можете попробовать этот код для удаления файлов и подфайлов
public void deleteFile(File f){
String[] flist=f.list();
for(int i=0;i<flist.length;i++){
System.out.println(" "+f.getAbsolutePath());
File temp=new File(f.getAbsolutePath()+"/"+flist[i]);
if(temp.isDirectory()){
deleteFile(temp) ;
temp.delete();
}else{
temp.delete();
}
Ответ 7
В вашем случае это отлично работает
http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html#cleanDirectory(java.io.File)
File dir = new File("dir_path");
if(dir.exists() && dir.isDirectory()) {
FileUtils.cleanDirectory(dir);
}
Если вы хотите удалить папку самостоятельно. (Он не должен быть пустым). Может также использоваться для файлов.
http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html#forceDelete(java.io.File)
File dir = new File("dir_path");
if(dir.exists()) {
FileUtils.forceDelete(dir);
}
Ответ 8
Этот код работает для меня. "imagesFolder" имеет несколько файлов и папок, которые, в свою очередь, имеют файлы.
if (imagesFolder.isDirectory())
{
String[] children = imagesFolder.list(); //Children=files+folders
for (int i = 0; i < children.length; i++)
{
File file=new File(imagesFolder, children[i]);
if(file.isDirectory())
{
String[] grandChildren = file.list(); //grandChildren=files in a folder
for (int j = 0; j < grandChildren.length; j++)
new File(file, grandChildren[j]).delete();
file.delete(); //Delete the folder as well
}
else
file.delete();
}
}
Ответ 9
# 1
File mFile = new File(Environment.getExternalStorageDirectory() + "/folder");
try {
deleteFolder(mFile);
} catch (IOException e) {
Toast.makeText(getContext(), "Unable to delete folder", Toast.LENGTH_SHORT).show();
}
public void deleteFolder(File folder) throws IOException {
if (folder.isDirectory()) {
for (File ct : folder.listFiles()){
deleteFolder(ct);
}
}
if (!folder.delete()) {
throw new FileNotFoundException("Unable to delete: " + folder);
}
}
# 2 (Root)
try {
Process p = Runtime.getRuntime().exec("su");
DataOutputStream outputStream = new DataOutputStream(p.getOutputStream());
outputStream.writeBytes("rm -Rf /system/file.txt\n");
outputStream.flush();
p.waitFor();
} catch (IOException | InterruptedException e) {
Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
Ответ 10
//Удалить папку и ее содержимое
public static void DeleteFolder(File folder)
{
try
{
FileUtils.deleteDirectory(folder);
} catch (Exception ex)
{
Log.e(" Failed delete folder: ", ex.getMessage());
}
}
//Только удаление содержимого папки
public static void DeleteFolderContents(File folder)
{
try
{
FileUtils.cleanDirectory(folder);
} catch (Exception ex)
{
Log.e(" Failed delete folder contents: ", ex.getMessage());
}
}
Документы: org.apache.commons.io.FileUtils.cleanDirectory
Ответ 11
rm -rf
был гораздо более производительным, чем FileUtils.deleteDirectory
или рекурсивно удалял каталог самостоятельно.
После обширного бенчмаркинга мы обнаружили, что использование rm -rf
было в несколько раз быстрее, чем использование FileUtils.deleteDirectory
.
Конечно, если у вас небольшой или простой каталог, это не имеет значения, но в нашем случае у нас было несколько гигабайт и вложенных вложенных подкаталогов, где это заняло бы более 10 минут с FileUtils.deleteDirectory
и только 1 минуту с rm -rf
.
Вот наша грубая реализация Java для этого:
// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean deleteDirectory( File file ) throws IOException, InterruptedException {
if ( file.exists() ) {
String deleteCommand = "rm -rf " + file.getAbsolutePath();
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec( deleteCommand );
process.waitFor();
return true;
}
return false;
}
Стоит попробовать, если вы имеете дело с большими или сложными каталогами.