文件删除/移动失败

时间:2012-01-03 15:56:13

标签: java file delete-file

在下面的代码中,我尝试从ArrayList xmls中选择xml文件,其中xmls.get(i)是扩展名为.xml的文件的绝对路径。如果文档无法解析此文件,则抛出异常并将文件移动到其他目录。但是,我无法移动或删除文件,尽管我可以将其复制到目录destFile。最后一个if语句的值对f.exists()f.canRead()f.canWrite(),f.canExecute返回true,但对f.renameTo(destFile);

返回false
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 个答案:

答案 0 :(得分: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;
} 

它不会关闭它,所以至少在Windows下,你不能删除它或重命名它。请注意,您不需要每次都创建DocumentBuilder。

答案 1 :(得分:1)

不确定建议你在文件对象上调用close()的答案,因为java.io.File没有这样的方法,但我认为它们正朝着正确的方向前进。

我建议切换到使用FileInputStream并关闭它。

parse方法可以采用File对象或FileInputStream,这样就可以了。