file.delete () возвращает false даже при том, что file.exists (), file.canRead (), file.canWrite (), file.canExecute () все возвращают true

Эта страница дает ответ, который да . http://math.stackexchange.com , похоже, не соблюдает \(\require{foo}\), но приведенная выше ссылка говорит вам, как добавить любой пакет в конфигурацию для вашего сайта.

Если вы не являетесь администратором сайта, вам, конечно, придется убедить всех, кто хочет установить пакет.

87
задан lesmana 14 July 2017 в 09:44
поделиться

4 ответа

Это был довольно странный трюк, который сработал. Дело в том, что когда я предварительно прочитал содержимое файла, я использовал BufferedReader . После прочтения я закрыл буфер.

Тем временем я переключился и теперь читаю контент, используя FileInputStream . Также после прочтения закрываю поток. И теперь это работает.

Проблема в том, что у меня нет объяснения этому.

Я не знаю, что BufferedReader и FileOutputStream несовместимы.

46
ответ дан 24 November 2019 в 07:47
поделиться

Нет причин, по которым вы не можете удалить этот файл. Я бы посмотрел, кто держит этот файл. В unix / linux вы можете использовать утилиту lsof, чтобы проверить, какой процесс заблокировал файл. В Windows вы можете использовать проводник процессов.

для lsof, это так же просто, как сказать:

lsof /path/and/name/of/the/file

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

вот код, который делает то, что, как мне кажется, вам нужно:

FileOutputStream to;

try {
    String file = "/tmp/will_delete.txt";
    to = new FileOutputStream(file );
    to.write(new String("blah blah").getBytes());
    to.flush();
    to.close();
    File f = new File(file);
    System.out.print(f.delete());
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Он отлично работает в OS X. Я не тестировал его в Windows, но подозреваю, что он должен работать и в Windows. Я также признаю, что наблюдал неожиданное поведение при обработке файлов Windows.

2
ответ дан 24 November 2019 в 07:47
поделиться

Как прокомментировал Джон Скит, вам следует закрыть свой файл в блоке finally {...}, чтобы он всегда был закрыт. И вместо того, чтобы проглатывать исключения с помощью e.printStackTrace, просто не улавливайте и не добавляйте исключение в сигнатуру метода. Если вы не можете по какой-либо причине, по крайней мере, сделайте это:

catch(IOException ex) {
    throw new RuntimeException("Error processing file XYZ", ex);
}

Теперь, вопрос №2:

Что, если вы сделаете это:

...
to.close();
System.out.println("Please delete the file and press <enter> afterwards!");
System.in.read();
...

Сможете ли вы удалить файл?

Также, файлы сбрасываются, когда они закрываются. Я использую IOUtils.closeQuietly (...), поэтому я использую метод flush, чтобы убедиться, что содержимое файла присутствует, прежде чем я попытаюсь закрыть его (IOUtils.closeQuietly не вызывает исключений). Примерно так:

...
try {
    ...
    to.flush();
} catch(IOException ex) {
    throw new CannotProcessFileException("whatever", ex);
} finally {
    IOUtils.closeQuietly(to);
}

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

3
ответ дан 24 November 2019 в 07:47
поделиться

Надеюсь, это поможет. Я столкнулся с аналогичной проблемой, когда я не мог удалить свой файл после того, как мой java-код скопировал содержимое в другую папку. После обширного поиска в Google я явно объявил все переменные, относящиеся к отдельной файловой операции, и вызвал метод close () каждого объекта файловой операции и установил для них значение NULL. Затем есть функция под названием System.gc (), которая очищает отображение файлового ввода-вывода (я не уверен, я просто говорю, что указано на веб-сайтах).

Вот мой пример кода :

public void start() {
    File f = new File(this.archivePath + "\\" + this.currentFile.getName());
    this.Copy(this.currentFile, f);

    if(!this.currentFile.canWrite()){
        System.out.println("Write protected file " +
           this.currentFile.getAbsolutePath());

        return;
    }


    boolean ok = this.currentFile.delete();
    if(ok == false){
        System.out.println("Failed to remove " + this.currentFile.getAbsolutePath());
        return;
    }
}

private void Copy(File source, File dest) throws IOException {
    FileInputStream fin;
    FileOutputStream fout;
    FileChannel cin = null, cout = null;
    try {
        fin = new FileInputStream(source);
        cin = fin.getChannel();
        fout = new FileOutputStream(dest);
        cout = fout.getChannel();

        long size = cin.size();
        MappedByteBuffer buf = cin.map(FileChannel.MapMode.READ_ONLY, 0, size);

        cout.write(buf);
        buf.clear();
        buf = null;

        cin.close();
        cin = null;

        fin.close();
        fin = null;

        cout.close();
        cout = null;

        fout.close();
        fout = null;

        System.gc();

    } catch (Exception e){
        this.message = e.getMessage();
        e.printStackTrace();
    }
}
1
ответ дан 24 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: