Проблема вашего первого подхода (цикл for) уже решена.
Относительно вашего второго подхода, я думаю, немного.Я предполагаю (не проверял), что удаление еще не закончено, когда вы перейдете к следующей итерации.Таким образом, listFiles () [0] может быть таким же, как и в предыдущей итерации.
Если ваш код печатает больше строк вывода (true для false), чем у вас есть файлы в каталоге, я бы предположил, что я угадаю правильно.
В любом случае решение, предложенное Джоакимом Даниэльсоном ...
for (File file : f.listFiles()) {
file.delete();
}
... решает обе проблемы, вызывая listFiles () только один раз, а затем повторяя итерацию по результирующему массиву.
Вы можете достичь того же (менее изящным способом), слегка изменив свой код:
File f = new File(this.pathToFolder);
if (f.exists() && f.isDirectory()) {
File[] files = f.listFiles(); // calling listFiles only once ...
for (int i = 0; i < files.length ; i++) { // ... and then operating on the resulting array
files[i].delete();
}
}
else {
f.mkdir();
}
... не проверено - надеюсь, я не ошибся.
Кстатиjavadoc для listFiles
говорит:
Нет никаких гарантий, что строки имен в результирующем массиве будут появляться в каком-либо определенном порядке;в частности, они не гарантированно отображаются в алфавитном порядке.
Это еще одна веская причина для не вызывать listFiles () более одного раза при обработке каталога.