Не могу удалить пустую папку - PullRequest
0 голосов
/ 24 апреля 2018

Внутри существующей папки я создал папку, а внутри нее несколько файлов, используя этот метод:

SeekableByteChannel createFile(String filePathToCreate) throws IOException {
    OpenOption[] options = {
            StandardOpenOption.WRITE,
            StandardOpenOption.CREATE_NEW,
            StandardOpenOption.SPARSE,
            StandardOpenOption.READ
            // TODO: think if we add CREATE if exist rule.
    };
    return Files.newByteChannel(Paths.get(filePathToCreate), options);
}

Структура папок / файлов:

- torrents-test
   - folder1
       - File-I-Created-1
       - File-I-Created-2
       - File-I-Created-3

Затем я попытался удалить папку torrents-test, используя этот метод:

void deleteDirectory(File directoryToBeDeleted) throws IOException {
    File[] allContents = directoryToBeDeleted.listFiles();
    if (allContents != null) {
        for (File file : allContents) {
            deleteDirectory(file);
        }
    }
    Files.delete(directoryToBeDeleted.toPath());
}

Затем я получил исключение, которое говорит мне, что папка folder1 не пуста, поэтому я не могу удалить ее:

java.nio.file.DirectoryNotEmptyException: C:\GIT\university\torrentx\torrents-test\folder1
    at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:266)
    at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
    at java.nio.file.Files.delete(Files.java:1126)
    at com.utils.Utils.deleteDirectory(Utils.java:389)
    at com.utils.Utils.deleteDirectory(Utils.java:386)
    at com.utils.Utils.deleteDownloadFolder(Utils.java:375)
    at com.utils.Utils.removeEverythingRelatedToTorrent(Utils.java:87)
    at com.steps.MyStepdefs.applicationCreateActiveTorrentFor(MyStepdefs.java:297)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at cucumber.runtime.Utils$1.call(Utils.java:40)
    at cucumber.runtime.Timeout.timeout(Timeout.java:16)
    at cucumber.runtime.Utils.invoke(Utils.java:34)
    at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:38)
    at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:37)
    at cucumber.runtime.Runtime.runStep(Runtime.java:300)
    at cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44)
    at cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39)
    at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:44)
    at cucumber.runtime.model.CucumberScenarioOutline.run(CucumberScenarioOutline.java:46)
    at cucumber.runtime.model.CucumberFeature.run(CucumberFeature.java:165)
    at cucumber.runtime.Runtime.run(Runtime.java:122)
    at cucumber.api.cli.Main.run(Main.java:36)
    at cucumber.api.cli.Main.main(Main.java:18)

Мой метод deleteDirectory сначала удаляет все файлы внутри каждой папки, которую пытается удалить, и только после этого удаляет папку. Исключение указывает, что удаление каждого файла в этой папке было успешным, потому что в противном случае я получу исключение ранее при попытке удалить один из файлов этой папки.

У меня вопрос - Почему я получаю это исключение?

1 Ответ

0 голосов
/ 24 апреля 2018

Javadoc java.nio.file.Files.delete(Path path) ясен:

Если файл является каталогом, каталог должен быть пустым.

Также указано:

Этот метод можно использовать с методом walkFileTree для удаления каталога и всех записей в каталоге или целого дерева файлов, где это необходимо.

Использование Files.walkFileTree() будетСделайте ваш код более понятным и коротким, но имейте в виду, что это не решит вашу реальную проблему.
Кроме того, ваш рекурсивный метод удаления всех ресурсов является правильным, так как вы удаляете ресурсы, начиная с более глубокого и переходя к резервному копированию менее глубокого.

Проблема в другом: на самом деле вы создаете текстовые файлы с Files.newByteChannel(), который создает несколько SeekableByteChannel экземпляров, которые связаны с File s.Следовательно, кажется, что он предотвращает удаление файлов на лету, когда вы вызываете Files.delete(directoryToBeDeleted.toPath());.
Так что закройте потоки перед удалением файлов, и это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...