Ошибка удаления / перемещения файла - PullRequest
1 голос
/ 03 января 2012

В приведенном ниже коде я пытаюсь выбрать xml-файлы из ArrayList xmls, где xmls.get (i) - абсолютный путь к файлу с расширением .xml. Если этот файл не может быть проанализирован Документом, возникает исключение, и файл перемещается в другой каталог. Однако я не могу переместить или удалить файл, хотя могу скопировать его в каталог destFile. Значения последнего оператора if возвращают true для f.exists(), f.canRead(), f.canWrite(), f.canExecute, но возвращают false для f.renameTo(destFile);

for(int i=0; i<xmls.size(); i++){
    boolean delete = false;

    try {
        File f = new File(xmls.get(i));
        File destFile = new File(structDir + "/badXMLs/" + f.getName());

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(f);
        doc.getDoctype();

    } catch (Exception e) {
        File f = new File(xmls.get(i));
        File destFile = new File(structDir + "/badXMLs/" + f.getName());

        System.out.println(f.getName());
        delete = true;
    } 

    if(delete){
        File f = new File(xmls.get(i));
        File destFile = new File(structDir + "/badXMLs/" + f.getName());

        System.out.println(f.exists());
        System.out.println(f.canRead());
        System.out.println(f.canWrite());
        System.out.println(f.canExecute());

        System.out.println(f.renameTo(destFile));
    }
}

Ответы [ 2 ]

3 голосов
/ 03 января 2012

DocumentBuilder по умолчанию не закрывает файл, когда вы получаете исключение. Самый простой способ избежать этого - использовать FileInputStream и закрыть его самостоятельно, например:

FileInputStream fis = null;

try {
    File f = new File(xmls.get(i));
    File destFile = new File(structDir + "/badXMLs/" + f.getName());
    fis = new FileInputStream(f);

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(fis); // parse the FileInputStream, not the File
    doc.getDoctype();

} catch (Exception e) {
    if (fis != null) {
        fis.close();
    }

    File f = new File(xmls.get(i));
    File destFile = new File(structDir + "/badXMLs/" + f.getName());

    System.out.println(f.getName());
    delete = true;
} 

Он не закрывает его, поэтому, по крайней мере, под окнами вы не можете удалить его или переименовать. Обратите внимание, что вам не нужно каждый раз создавать DocumentBuilder.

1 голос
/ 03 января 2012

Не уверен насчет ответов, которые предполагают, что вы вызываете close () для файлового объекта, поскольку у java.io.File такого метода нет, но я думаю, что они движутся в правильном направлении.

I 'Я предлагаю переключиться на использование FileInputStream и закрыть его.

метод синтаксического анализа может принимать либо объект File, либо FileInputStream, так что все должно быть в порядке.

...