Удалите каталоги рекурсивно в Java

https://howtodoinjava.com/java/io/how-to-delete-teilitary-file-in-java/

здесь у вас есть хороший учебник. Убедитесь, что вы вызываете

File.deleteOnExit();

Запросы на удаление файла или каталога, обозначенного этим абстрактным путем, после завершения работы виртуальной машины

blockquote>

См. https. : //docs.oracle.com/javase/8/docs/api/java/io/File.html#deleteOnExit--

369
задан Francesco Menzani 14 September 2015 в 03:35
поделиться

6 ответов

Вы должны проверить Apache commons-io . У него есть класс FileUtils , который будет делать то, что вы хотите.

FileUtils.deleteDirectory(new File("directory"));
454
ответ дан 23 November 2019 в 00:05
поделиться

Может быть, решение этой проблемы может быть переопределить метод delete класса File, используя код из ответа Эриксона:

public class MyFile extends File {

  ... <- copy constructor

  public boolean delete() {
    if (f.isDirectory()) {
      for (File c : f.listFiles()) {
        return new MyFile(c).delete();
      }
    } else {
        return f.delete();
    }
  }
}
1
ответ дан 23 November 2019 в 00:05
поделиться

Вот простой метод main, который принимает аргумент командной строки, вам может понадобиться добавить собственную проверку ошибок или настроить ее так, как вы считаете нужным.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class DeleteFiles {

/**
 * @param intitial arguments take in a source to read from and a 
 * destination to read to
 */
    public static void main(String[] args)
                     throws FileNotFoundException,IOException {
        File src = new File(args[0]);
        if (!src.exists() ) {
            System.out.println("FAILURE!");
        }else{
            // Gathers files in directory
            File[] a = src.listFiles();
            for (int i = 0; i < a.length; i++) {
                //Sends files to recursive deletion method
                fileDelete(a[i]);
            }
            // Deletes original source folder
            src.delete();
            System.out.println("Success!");
        }
    }

    /**
     * @param srcFile Source file to examine
     * @throws FileNotFoundException if File not found
     * @throws IOException if File not found
     */
    private static void fileDelete(File srcFile)
                     throws FileNotFoundException, IOException {
        // Checks if file is a directory
        if (srcFile.isDirectory()) {
            //Gathers files in directory
            File[] b = srcFile.listFiles();
            for (int i = 0; i < b.length; i++) {
                //Recursively deletes all files and sub-directories
                fileDelete(b[i]);
            }
            // Deletes original sub-directory file
            srcFile.delete();
        } else {
            srcFile.delete();
        }
    }
}

Надеюсь, это поможет!

2
ответ дан 23 November 2019 в 00:05
поделиться

С Java 7 мы наконец можем сделать это с надежным обнаружением символической ссылки. (Я не считаю, что Apache commons-io в настоящее время имеет надежное обнаружение символических ссылок , поскольку он не обрабатывает ссылки в Windows, созданные с помощью mklink .)

Для ради истории, вот ответ до Java 7, который следует за символическими ссылками.

void delete(File f) throws IOException {
  if (f.isDirectory()) {
    for (File c : f.listFiles())
      delete(c);
  }
  if (!f.delete())
    throw new FileNotFoundException("Failed to delete file: " + f);
}
189
ответ дан 23 November 2019 в 00:05
поделиться

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;

}

Стоящий попытки, если Вы имеете дело с большими или сложными каталогами.

0
ответ дан 23 November 2019 в 00:05
поделиться

Guava имел Files.deleteRecursively (File) , поддерживаемый до Guava 9 .

Из Guava 10 :

Не рекомендуется. Этот метод страдает плохим обнаружением символических ссылок и условиями гонки. Эта функциональность может поддерживаться надлежащим образом только с помощью командного интерпретатора операционной системы, такой как rm -rf или del / s . Этот метод планируется удалить из Guava в выпуске Guava 11.0.

Следовательно, в Guava 11 такого метода нет.

15
ответ дан 23 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: