Удаление файлов (странное расширение) - PullRequest
0 голосов
/ 27 мая 2018

У меня проблема, когда я хочу удалить файлы в репозитории, используя Java.Что я хочу сделать, это проверить, существует ли репозиторий, если я хочу, я хочу удалить все файлы, которые он содержит.Вот мой код:

File f = new File(this.pathToFolder); 

if (f.exists() && f.isDirectory()) {
  for (int i = 0; i < f.listFiles().length ; i++) {    
    f.listFiles()[i].delete(); 
  }
}     
else {
  f.mkdir();
}

Но дело в том, что иногда он не удаляет файлы.Я предполагаю, что это потому, что файлы, которые я хочу удалить, имеют странный заголовок, такой как: 1.20.36579.55485875 Это файлы, которые я загружаю, и я не могу выбрать их имена.

Теперь я попробовал что-то вроде этого:

File f = new File(this.pathToFolder); 

if (f.exists() && f.isDirectory()) {
  int i = 0;
  while (f.listFiles().length != 0) {
    boolean remove  = f.listFiles()[i].delete(); 
    System.out.println(remove);
  }
} 
else {
  f.mkdir();
} 

В консоли я получаю много «ложных» (около 15), а затем, в конечном итоге, истинное значение.

Iне понимаю, почему это так.Может быть, у некоторых из вас будет идея.

Спасибо, Вацлав

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Проблема вашего первого подхода (цикл 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 () более одного раза при обработке каталога.

0 голосов
/ 28 мая 2018

Попробуйте перебрать файлы с помощью итератора

for (Iterator<File> it = Arrays.stream(f.listFiles()).iterator(); it.hasNext();) {
    File file = it.next();  
    file.delete();
}
0 голосов
/ 28 мая 2018

Проблема с вашим кодом заключается в том, что вы изменяете массив listFiles () при удалении файлов, так что размер массива уменьшается с каждым циклом.

Попробуйте это

for (File file : f.listFiles()) {
    file.delete();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...