1

我正在使用icefaces将文件上传到我的网络应用程序中的相对路径(mywebapp/audio),然后在文件上传后我将其重命名以保存其扩展名,如下所示:

public static File changeExtToWav(FileInfo fileInfo,
            StringBuffer originalFileName) {
        log.debug("changeExtToWav");
        int mid = fileInfo.getFile().getName().lastIndexOf(".");
        String fileName = fileInfo.getFile().getName().substring(0, mid);
        originalFileName.append(fileName);
        log.debug("originalFileName: " + originalFileName);
        String newFileName = fileName + "_" + new Date().getTime() + "."
                + "wav";
        File newFile = new File(fileInfo.getFile().getParent() + "/"
                + newFileName);
        log.debug("newFileName: " + newFile.getName());
        fileInfo.getFile().renameTo(newFile);
        return newFile;
    }

文件上传后,有时我想从 UI 按钮中删除它,如下所示:

try {

            File fileToDelete = new File(filePath); // correct file path
            log.debug("file exists: " + fileToDelete.exists()); // true
            fileToDelete.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }

文件路径是正确的,我没有例外,但文件没有被删除(我使用的是 java 6 btw)。请告知如何解决此问题。

更新:使用以下有用的方法,我可以得到文件已打开,任何想法如何关闭它?

public String getReasonForFileDeletionFailureInPlainEnglish(File file) {
    try {
        if (!file.exists())
            return "It doesn't exist in the first place.";
        else if (file.isDirectory() && file.list().length > 0)
            return "It's a directory and it's not empty.";
        else
            return "Somebody else has it open, we don't have write permissions, or somebody stole my disk.";
    } catch (SecurityException e) {
        return "We're sandboxed and don't have filesystem access.";
    }
}
4

1 回答 1

1

好吧,如果文件是打开的,那么有两种解决方案:

  • 您的程序中有一个在此文件上打开的流。请注意,afaik 在 Windows 上是个问题,使用 Unix,即使在其上打开了流,我也可以删除文件。

  • 您有其他进程正在使用此文件。所以在这种情况下,你不能从 Java 做任何事情。

在日志中它还告诉它可能是权限问题,您确定您有足够的权限吗?

您还可以使用Files#delete(Path path) (jdk7) 了解有关该问题的更多详细信息。

于 2012-07-08T14:28:34.573 回答