2015-10-29 51 views
0

在我們的程序中,我們可以導入jar或fxml文件以使用自定義JavaFX組件。因此,該文件被複制到一個單獨的目錄中,應用程序僅使用複製的文件來處理掃描等。Java:文件被鎖定在應用程序

在少數情況下,可能會發生這種情況,例如原始jar被更改,並且使用命令「clean」重新編譯。所以這會刪除所有必要的文件,包括導入的jar文件。但是如果我們的應用程序仍在運行,maven會因爲jar無法刪除而失敗。似乎在文件上有一個鎖,可以防止該jar被刪除。只有我們先關閉應用程序,才能最終刪除jar。

那麼是否有任何方法可以釋放文件,以便它不會中斷文件上的任何操作,即使應用程序正在運行?

在複製文件之前刪除文件已失敗。

編輯

好吧,掃描過程的提示是正確的,我認爲。在複製jar之前,程序會掃描原始jar以查找應該包含的組件。該文件在創建JarFile對象後立即鎖定。

public JarReport explore(ClassLoader classLoader) throws IOException { 
    final JarReport result = new JarReport(jar); 

    try (JarFile jarFile = new JarFile(jar.toFile())) { 
     final Enumeration<JarEntry> e = jarFile.entries(); 
     while (e.hasMoreElements()) { 
      final JarEntry entry = e.nextElement(); 
      result.getEntries().add(exploreEntry(entry, classLoader)); 
     } 
    } 

    return result; 
} 

因此,第4行創建了JarFile對象,這意味着該文件被解壓縮。在這行之後,我無法刪除該jar。那麼我必須關閉解壓後的文件才能刪除它?

+0

請添加一些關於您的掃描過程的更多信息。可能你忘了關閉裏面的東西 –

回答

0

如果你想要停止刪除文件then read the documentation here,如果你想要的是確保文件被擦除,那麼確保文件沒有任何反應,也沒有在給定的文件上使用任何文件相關的操作...

如果您使用的是Windows,那麼如果一個應用程序有控制文件(例如一個C程序,已Filefopen(x),則X不能從另一個應用程序訪問,也沒有被軟件寫(通過刪除啓動寫在)

在Linux中,有rm命令將刪除該文件,即使一個應用程序當前擁有文件資源

0

在Windows上,SysInternals Handle可以關閉正在使用的文件句柄(-c)。這是一個無需用戶交互即可運行的命令行工具。

-c關閉指定的句柄(解釋爲十六進制數字)。您必須通過其PID指定過程。 警告:關閉手柄可能會導致應用程序或系統不穩定。

可能需要編寫一個小批處理腳本,首先通過文件名搜索句柄,然後關閉它。