2012-01-03 2 views
1

В приведенном ниже коде я пытаюсь выбрать xml-файлы из массива ArrayList xmls, где xmls.get (i) - это абсолютный путь к файлу с расширением .xml. Если этот файл не может быть проанализирован документом, генерируется исключение, и файл перемещается в другой каталог. Однако я не могу перемещать или удалять файл, хотя я могу скопировать его в каталог destFile. Значения возврата последней, если заявление верно для f.exists(), f.canRead(), f.canWrite(), f.canExecute но возвращает ложь для 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)); 
    } 
} 
+0

Одна из причин заключается в том, что ваш целевой каталог находится на другой точке монтирования, это тот случай? – fge

+0

'} catch (Исключение e) {' - этот код ловит * все * исключения; вы должны поймать конкретное исключение, которое вас интересует (поскольку «файл не может быть проанализирован документом»). В противном случае вы попытаетесь удалить файл, если, например, в вашем коде есть «NullPointerException» или какая-либо другая ошибка – artbristol

ответ

3

По умолчанию 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

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

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

метод parse может принимать либо объект File, либо FileInputStream, чтобы это было нормально.

Смежные вопросы