FileUtils.deleteDirectory尝试删除以句点结尾的目录

时间:2014-08-29 15:41:22

标签: java io fileutils apache-commons-io

我有一个目录,我以编程方式(在Java中)进行递归解压缩(这似乎有效),但最后我留下了一个包含很多子目录和文件的目录。每次运行此方法时,我都想从一个干净的平板开始,所以我总是删除临时目录中存在的文件夹及其剩余文件和子目录。

    root = new File(System.getProperty("java.io.tmpdir")+ File.separator + "ProductionTXOnlineCompletionDataPreProcessorRoot");
    if(root.exists()){
        try {
            FileUtils.deleteDirectory(root);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if(root.mkdir()){
        rawFile = createRawDataFile();
    }

我从FileUtils.deleteDirectory得到了一个非常奇怪的错误。

14:55:27,214 ERROR [stderr] (Thread-3 (HornetQ-client-global-threads-2098205981)) java.io.IOException: Unable to delete directory C:\Users\Admin\AppData\Local\Temp\ProductionTXOnlineCompletionDataPreProcessorRoot\ProductionTXOnlineCompletionDataPreProcessor8718674704286818303.

似乎我认为我的目录末尾有一段时间(它没有,所以它不能删除它并不奇怪)。有时,此错误出现在子目录中的文件夹中。有没有人见过这个?

我正在使用Commons IO 2.4 jar。

编辑我已经确认这些目录没有句点,所以除非它们不可见,否则我不知道为什么该方法会认为有句点。我提供方法的文件路径在将其作为参数提供之前设置,并且任何人都可以看到 - 它最后没有句号。

我在Windows 7上运行程序。

编辑这是我用于递归解压缩的代码:

private void extractFolder(String zipFile) throws IOException 
{
    int BUFFER = 2048;
    File file = new File(zipFile);
    ZipFile zip = null;
    String newPath = zipFile.substring(0, zipFile.length() - 4);
    BufferedOutputStream dest = null;
    BufferedInputStream is = null;
    try{
        zip = new ZipFile(zipFile);
        Enumeration<? extends ZipEntry> zipFileEntries = zip.entries();

        while (zipFileEntries.hasMoreElements())
        {
            ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
            String currentEntry = entry.getName();
            File destFile = new File(newPath, currentEntry);

            File destinationParent = destFile.getParentFile();

            destinationParent.mkdirs();
            if (!entry.isDirectory())
            {
                is = new BufferedInputStream(zip
                .getInputStream(entry));
                int currentByte;

                byte data[] = new byte[BUFFER];

                FileOutputStream fos = new FileOutputStream(destFile);
                dest = new BufferedOutputStream(fos, BUFFER);

                // read and write until last byte is encountered
                while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
                    dest.write(data, 0, currentByte);
                }
                dest.flush();
            }

            if (currentEntry.endsWith(".zip")){
                // found a zip file, try to open
                extractFolder(destFile.getAbsolutePath());
            }
    }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        if(dest!=null) {dest.close();}
        if(is!=null) {is.close();}
        zip.close();
    }
}

我将原始zip放入根目录,然后从那里递归解压缩。

这是相关代码,显示:

downloadInputStreamToFileInRootDir(in, rawFile);
try {
        extractFolder(rawFile.getCanonicalPath());
    } catch (IOException e) {
        e.printStackTrace();
    }catch (Exception e){

    }

我刚刚注意到我首先使用rawFile.getCanonicalPath()(rawFile在第一个代码摘录中设置)作为extractFolder的参数,然后切换到destFile.getAbsolutePath()...也许这与它有关。测试这个问题的问题是该问题不具有确定性。它有时会发生,有时不会发生。

1 个答案:

答案 0 :(得分:2)

该句号是错误消息的一部分。它没有尝试删除末尾有句号的文件路径。请参阅FileUtils来源:

if (!directory.delete()) {
    final String message =
            "Unable to delete directory " + directory + ".";
    throw new IOException(message);
}