Не удается удалить файлы в каталогах, которые я переименовал в Java? - PullRequest
2 голосов
/ 31 января 2012

Сегодня я возился с методами java.io.File и наткнулся на что-то странное.

Когда я переименовываю каталог, я не могу удалить файлы или новый каталог.

    File dir = new File("dir");
    dir.mkdir();

    File file = new File(dir, "afile.txt");
    file.createNewFile();

    File newname = new File(dir, "newName.txt");
    file.renameTo(newname);

    File newdir = new File("newdir");
    dir.renameTo(newdir);

    System.out.println("file exists? " + file.exists());
    System.out.println("file deleted? " + file.delete());
    System.out.println("newname exists? " + newname.exists());
    System.out.println("deleted newname? " + newname.delete());
    System.out.println("dir exists? " + dir.exists());
    System.out.println("dir deleted? " + dir.delete());
    System.out.println("newdir exists? " + newdir.exists());
    System.out.println("deleted newdir? " + newdir.delete());

Выходные данные:

    file exists? false
    file deleted? false
    newname exists? false
    deleted newname? false
    dir exists? false
    dir deleted? false
    newdir exists? true
    deleted newdir? false

В файловой системе, однако, и newdir, и newname.txt все еще существуют!

Однако, если я закомментирую переименование каталога, удаление работает нормально.

Существуют ли дополнительные правила между delete () и rename (), о которых нужно знать? В Javadoc не так много.

Ответы [ 3 ]

6 голосов
/ 31 января 2012

Я не вижу проблем с выводом:

  1. В конце переименования существуют только newdir/ и newdir/newName.txt.Поэтому первые шесть строк вывода должны быть false, и они есть.( В частности, переменная newname по-прежнему ссылается на dir/newName.txt, который больше не существует. )

  2. newdir существует;ваши выходные данные подтверждают это.

  3. Конечный delete() не работает, поскольку каталог не пустой.

В итоге все выглядит так, как можно было ожидать.

1 голос
/ 31 января 2012

Как сказал Экс в своем комментарии: он пытается удалить dir/newName.txt, и этого больше не существует, поскольку вы переименовали его в newdir/newName.txt.

0 голосов
/ 31 января 2012

Если базовые файловые каналы не были закрыты JVM, вы не сможете удалить файлы из Проводника, так как они все равно будут помечены как заблокированные.

...