2013-08-01 24 views
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沒有返回。有沒有解決的辦法?

回答

1

嗯。看起來你正試圖刪除一個目錄?

FileUtils.forceDelete(new File(uploadedFileLocation)); 

uploadedFileLocation是 「C:\ TEMP」 從你的 post方法。我不確定這是否會導致問題,或者這是否爲預期行爲,但該代碼不會刪除zip文件,並且正在嘗試刪除實際的C:\ temp目錄。

此外,可能值得注意的是:在您的writeToFile方法中,您正在初始化OutputStream out兩次。我不是100%,但可能是第一次初始化是保持文件指針打開,直到從堆棧中刪除整個對象(即當post返回時)。取出第二個初始化並查看是否有任何更改發生?

+0

對不起,我accidentily省略它。現在有一個文件名。 'C:/ temp/abc.zip' –

+1

在這種情況下,我仍然傾向於雙重初始化的輸出流,該輸出流可能會將該位置的文件保持爲打開狀態,直到對象退出堆棧。 我並不熟悉FileUtils庫,但我知道'java.io.File'類確實有它自己的刪除函數。也許如果第一個方法不起作用,請嘗試'new File(fileUploadLocation).delete()'。 此外,當它失敗時,你會得到一個異常消息嗎?如果是這樣,你可以將它添加到你的文章? – Deactivator2

+0

原來我應該調用'file.delete();'而不是使用'FileUtils'。 –

0

我想你的問題可能是由於你使用「C:/ temp」而不是「C:/ temp/fileName」導致的,所以你最終試圖刪除一個你可能沒有權限的文件夾。

0

您不需要使用文件位置,爲什麼不使用實際文件? 將文件作爲參數傳遞並在完成後執行file.delete();

0

如果問題不是您正在嘗試刪除某個目錄,那麼很可能您要刪除的文件仍處於打開狀態。在Windows上,這意味着這將阻止您刪除該文件。

通過它的外觀,您的writeToFile方法打開文件兩次......但只關閉一次。我懷疑這意味着它會泄漏文件描述符,操作系統會認爲應用程序仍在使用該文件。


原來我應該()稱爲file.delete;而不是使用FileUtils。

我不這麼認爲。當然,由於文件沒有被刪除,你不會得到例外。但File.delete()將返回false而您的應用程序會將文件保留在文件系統中。從長遠來看,這可能會更糟,除非你有其他的東西來清理孤立的文件。