0

我先把我的代码:

@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(),它说它不能删除文件。它是解压缩后删除 zip 的理想选择。

编辑:我只能在post(InputStream zip)返回后删除文件。如果我从post方法中调用 delete,它不会删除,因为 post 没有返回。有没有解决的办法?

4

4 回答 4

1

唔。看来您正在尝试删除目录?

FileUtils.forceDelete(new File(uploadedFileLocation));

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

另外,可能值得注意的是:在您的writeToFile方法中,您进行了OutputStream out两次初始化。我对此不是 100% 的,但可能是第一次初始化保持文件指针打开,直到整个对象从堆栈中删除(即post返回时)。取出第二次初始化,看看有没有变化?

于 2013-08-01T14:41:42.377 回答
0

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

于 2013-08-01T14:39:26.967 回答
0

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

于 2013-08-01T14:46:46.727 回答
0

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

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


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

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

于 2013-08-01T14:48:44.513 回答