作为参数时,无法删除文件

时间:2013-08-01 14:29:35

标签: java file delete-file

我会把我的代码放在第一位:

@Post
public Representation post(InputStream zip) throws Throwable {
    createFile(zip, "C:/temp\abc.zip");
    return new StringRepresentation("File uploaded");
}    

public void createFile(InputStream zipStream, uploadedFileLocation) throws Exception {
    try {
        writeToFile(zipStream, uploadedFileLocation);
        FileUtils.forceDelete(new File(uploadedFileLocation));
        } catch (Exception e) {
             throw e;
        }
}


private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation) {
    try {
        OutputStream out = new FileOutputStream(new File(uploadedFileLocation));
        int read = 0;
        byte[] bytes = new byte[1024];

        out = new FileOutputStream(new File(uploadedFileLocation));
        while ((read = uploadedInputStream.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        out.flush();
        out.close();
        uploadedInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我正在尝试创建一个允许用户上传zip文件的服务器。然后服务器将zip文件写入磁盘,解压缩,然后删除zip,同时保持服务器上的解压缩部分。但是,当我将zip文件发送到我的服务器时,它无法删除。使用FileUtils.forceDelete()时,它表示无法删除文件。解压后拉链是理想的选择。

编辑:我只能在post(InputStream zip)返回后删除该文件。如果我在post方法中调用delete,则不会删除,因为post尚未返回。有办法解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

<击>嗯。您似乎正在尝试删除目录?

FileUtils.forceDelete(new File(uploadedFileLocation));

uploadedFileLocation方法中post为“C:\ temp”。我不确定这是否会导致问题,或者这是否是预期的行为,但该代码不会删除zip文件,并且正在尝试删除实际的C:\ temp目录。

此外,值得注意的是:在writeToFile方法中,您要初始化OutputStream out两次。我不是百分之百,但可能是第一次初始化是保持文件指针打开,直到从堆栈中删除整个对象(即,当post返回时)。取出第二次初始化并查看是否发生了任何变化?

答案 1 :(得分:0)

我猜您的问题可能是由于您使用“C:/ temp”而不是“C:/ temp / fileName”引起的,所以您最终会尝试删除一个您可能没有权限的文件夹。

答案 2 :(得分:0)

您不需要使用文件位置,为什么不使用实际文件? 将文件作为参数传递,并在完成后执行file.delete();

答案 3 :(得分:0)

如果问题不在于您尝试删除目录,那么您尝试删除的文件很可能仍处于打开状态。在Windows上,这意味着将阻止您删除该文件。

根据它的外观,您的writeToFile方法会打开文件两次......但只关闭一次。我怀疑这意味着它会泄漏文件描述符,操作系统会认为应用程序仍在使用该文件。


  

事实证明我应该调用file.delete();而不是使用FileUtils。

我不这么认为。当然,由于文件未被删除,您不会获得异常。但是File.delete()将返回false,您的应用程序将把文件留在文件系统中。从长远来看,这可能会更糟,除非你已经有其他东西来清除孤立的文件。