2015-08-04 3 views
0

Я понимаю, что существует целый ряд потоков, охватывающих эту тему, но все, что я нашел до сих пор, не удалось выполнить, поэтому я думаю, что мне что-то не хватает.Как удалить файл, когда File.delete() отказывается работать?

У меня есть раздел кода, который должен позволять пользователю выбирать имя из списка. Эти имена были загружены из зашифрованного файла с именем users.ldf (зашифрованный формат файла, используемый только моим программным обеспечением). Как только пользователь выбрал имя, они нажимают кнопку, которая отключает этот раздел кода. Код должен пройти через файл, скопировать каждую строку в новый файл, за исключением той, которая была выбрана, удалить старый файл и затем переименовать новый файл как то же имя, что и старый файл, который был удален, тем самым удалив имя из списка. Однако старый файл никогда не удаляется, и новый файл никогда не переименовывается. Вот код:

private void delUserBtnActionPerformed(java.awt.event.ActionEvent evt) { 
    String user = lm.getElementAt(userList.getSelectedIndex()).toString(); 
     try { 
      Encryption e = new Encryption(); 
      File oldfile = new File("libs/users.ldf"); 
      File newfile = new File("libs/temp.ldf"); 
      PrintWriter writer = new PrintWriter(new FileWriter(newfile, false)); 
      Scanner scanner = new Scanner(oldfile); 

      while (scanner.hasNextLine()) { 

       String lineFromFile = scanner.nextLine(); 
       String line = e.decrypt(lineFromFile); 

       if (!line.contains(user)) { 
        writer.write(e.encrypt(line)); 
        System.out.println("Keeping user " + line); 
       } else { 
        System.out.println("Erasing user " + line); 
       } 

      } 

      try { 

       writer.flush(); 
       writer.close(); 
       scanner.close(); 
       System.gc(); 

      } catch (Exception exc) { 
       exc.printStackTrace(); 
      } 

      oldfile.delete(); 
      newfile.renameTo(new File("libs/users.ldf")); 
      lm.clear(); 
      JOptionPane.showMessageDialog(null, "User " + user + " removed!"); 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(EditUsers.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(EditUsers.class.getName()).log(Level.SEVERE, null, ex); 
     } 
} 

Я попытался:

Установка oldfile.setWritable (истинного) перед удалением.
Использование BufferedWriter вместо PrintWriter, а также FileOutputStream. Запуск сборщик мусора. Все остальные экземпляры файла в любом месте программы закрыты и очищены. Я попытался положить смывные и близкие части в finally блоке, но даже если я пишу ...

finally { 
    try { 
    //Flush, close, System.gc etc.... 
    } catch (IOException exc) { 
} 

NetBeans высвечивает ошибку и говорит finally without try.

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

Я должен упомянуть, я тоже побежал код с:

ProcessBuilder pb = new ProcessBuilder("del", oldfile"); 
Process p = pb.start(); 
p.waitFor(); 

который привел за исключением «Не удалось найти указанный файл». Я проверил и дважды проверил путь к файлу, и файл был полностью готов, поэтому местоположение было таким, как ожидалось. Для получения информации класс Encryption просто получает строку, шифрует ее и возвращает зашифрованную строку, поэтому не имеет экземпляра файла, содержащегося в нем.

Есть ли какая-либо другая методология, которую я могу использовать для удаления этого файла?

Я запускаю Win10, NetBeans 8.0.2 и самую последнюю версию JDK. Большое спасибо,

G

+0

Во-первых: используйте [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). Второй: используйте ['java.nio' вместо устаревшего' File' api] (https://docs.oracle.com/javase/tutorial/essential/io/delete.html). – Tom

+0

Какое исключение вы получаете при запуске? Почему он не работает? Я подозреваю, что проблема с правами доступа. – Buurman

+0

Исключения не выбрасываются, 'oldfile' просто не удаляется, а' newfile' не переименовывается. Код выполняется так, как если бы он работал отлично. Я должен добавить это к вопросу. –

ответ

0

ОК, так что лучшее, что я могу придумать что-то вроде уродливого исправления, и далеко от совершенства.

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