file.delete () возвращает false, хотя file.exists (), file.canRead (), file.canWrite (), file.canExecute () все возвращают true - PullRequest
86 голосов
/ 14 июня 2009

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

private void writeContent(File file, String fileContent) {
    FileOutputStream to;
    try {
        to = new FileOutputStream(file);
        to.write(fileContent.getBytes());
        to.flush();
        to.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Как видно, я очищаю и закрываю поток, но когда я пытаюсь удалить, file.delete() возвращает false.

Я проверил перед удалением, чтобы увидеть, существует ли файл, и: file.exists(), file.canRead(), file.canWrite(), file.canExecute() все возвращают true. Сразу после вызова этих методов я пытаюсь file.delete() и возвращает false.

Что-то я сделал не так?

Ответы [ 17 ]

0 голосов
/ 29 марта 2017

ДЛЯ Eclipse / NetBeans

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

Вот мой код:

File file = new File("file-path");
if(file.exists()){
  if(file.delete()){
     System.out.println("Delete");
  }
  else{

       System.out.println("not delete");
  }
}

Выход:

Удалить

0 голосов
/ 15 декабря 2015

У меня была такая же проблема на Windows. Раньше я читал файл в scala построчно с

Source.fromFile(path).getLines()

Теперь я читаю это в целом с

import org.apache.commons.io.FileUtils._

// encoding is null for platform default
val content=readFileToString(new File(path),null.asInstanceOf[String])

, который правильно закрывает файл после прочтения и теперь

new File(path).delete

работает.

0 голосов
/ 03 февраля 2014

если file.delete () отправляет false, то в большинстве случаев ваш дескриптор Bufferedreader не будет закрыт. Просто близко, и, кажется, у меня работает нормально.

0 голосов
/ 22 декабря 2013

Вы должны закрыть все потоки или использовать блок try-with-resource

static public String head(File file) throws FileNotFoundException, UnsupportedEncodingException, IOException
{
    final String readLine;
    try (FileInputStream fis = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
            LineNumberReader lnr = new LineNumberReader(isr))
    {
        readLine = lnr.readLine();
    }
    return readLine;
}
0 голосов
/ 11 августа 2013

Проблема может заключаться в том, что файл по-прежнему считается открытым и заблокированным программой; или, может быть, это компонент вашей программы, в котором он был открыт, поэтому вы должны убедиться, что для решения этой проблемы вы используете метод dispose(). т.е. JFrame frame; .... frame.dispose();

0 голосов
/ 01 марта 2011

Однажды возникла проблема в ruby, когда файлам в Windows требовался "fsync", чтобы действительно иметь возможность развернуться и перечитать файл после его записи и закрытия. Может быть, это аналогичное проявление (и если да, то я думаю, что ошибка Windows, на самом деле).

0 голосов
/ 11 сентября 2012

Ни одно из перечисленных здесь решений не сработало в моей ситуации. Мое решение состояло в том, чтобы использовать цикл while, пытаясь удалить файл, с 5-секундным (настраиваемым) пределом для безопасности.

File f = new File("/path/to/file");

int limit = 20; //Only try for 5 seconds, for safety
while(!f.delete() && limit > 0){
    synchronized(this){
        try {
            this.wait(250); //Wait for 250 milliseconds
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    limit--;
}

Использование вышеуказанного цикла работало без необходимости какого-либо ручного сбора мусора или установки потока на нуль и т. Д.

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