2012-09-20 81 views
6

我在Windows 64位上使用Oracle Java 7。如何強制Java 7在Windows上創建「目錄符號鏈接」而不是「文件符號鏈接」?

當我創建使用Files.createSymbolicLink一個符號,我注意到此行爲:

  1. 如果目標是一個目錄,「目錄符號鏈接」創建。
  2. 如果目標是文件,則會創建「文件符號鏈接」。
  3. 如果目標不存在,則創建「文件符號鏈接」。

The type of the symlink is fixed and never changes,無論其目標有任何變化。

使用Windows的原生mklink命令,可以強制鏈接類型爲「目錄符號鏈接」。是否可以使用本地Java API或某個庫來實現此目的?

一個微不足道的和醜陋的方式是:

  1. 如果目標是一個目錄,只是創建鏈接
  2. 如果目標不存在,創建一個新的空目標目錄,創建鏈接,並刪除該目錄。
  3. 如果目標是一個文件...處理它(移動它,應用#2,將其移回)。

Fugly。

回答

2

不幸的是我沒有在Java API中看到一種方法來做到這一點。

我檢查Windows的JRE代碼,它看起來像的決定是基於文件屬性本身:

try 
{ 
    WindowsFileAttributes windowsfileattributes = WindowsFileAttributes.get(windowspath2, false); 
    if(windowsfileattributes.isDirectory() || windowsfileattributes.isDirectoryLink()) 
     i |= 1; 
} 

的屬性本身從本地代碼起源,它看起來像有沒有辦法影響他們。

很明顯,你有其他選擇,如手動調用mklink或甚至使用像PowerMock(這顯然不是爲此目的)的操縱返回的對象。

另一個骯髒的選擇是創建所有相關類的代理:Path,FileSystemFileSystemProvider
它的工作方式是Path返回FileSystem,返回FileSystemProvider - 您需要做的是修改FileSystemProvider.createSymbolicLink方法的行爲方式。

createSymbolicLink方法接收當前未使用的可變參數的參數 - 你可以傳遞參數給它,這將表明您的包裝,它需要覆蓋符號鏈接的創建方法 - 和你去:)

寫完所有這些之後 - 我唯一的問題就是 - 爲什麼你需要這種行爲?

+0

其實沒有什麼太大的需求,我只是通過程序中的一個錯誤發現了這種行爲,導致符號鏈接的目標不被創建。 – ripper234