2012-09-20 14 views
6

Uso Oracle Java 7 su Windows 64 bit.Come forzare Java 7 a creare "collegamenti simbolici di directory" su Windows invece di "file symlinks"?

Quando creo un link simbolico utilizzando Files.createSymbolicLink, ho notato questo comportamento:

  1. Se il bersaglio è una directory, un "directory collegamento simbolico" è stato creato.
  2. Se la destinazione è un file, viene creato un "file symlink".
  3. Se la destinazione non esiste, viene creato un "file symlink".

The type of the symlink is fixed and never changes, indipendentemente da eventuali modifiche al target.

Utilizzando il comando nativo di Windows mklink, è possibile forzare il tipo di collegamento come "link simbolico di directory". È possibile raggiungere questo obiettivo utilizzando l'API Java nativa o una libreria?

Un modo banale e brutta è:

  1. Se il bersaglio è una directory, basta creare il link
  2. Se la destinazione non esiste, creare una nuova directory di destinazione vuota, creare il collegamento, ed elimina la directory.
  3. Se il target è un file ... gestirlo (spostarlo, applicare # 2, spostarlo indietro).

Fugly.

risposta

2

Purtroppo non vedo un modo all'interno delle API Java per farlo.

ho controllato il codice di Windows JRE e sembra che la decisione si basa sul file stessi attributi:

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

La attributi stessi provengono da codice nativo, e sembra che non v'è alcun modo per influire su di loro.

Chiaramente avete altre opzioni come invocare manualmente mklink o anche manipolare gli oggetti restituiti usando qualcosa come PowerMock (che chiaramente non è inteso per questo scopo).

Un'altra opzione sporca è creare i proxy di tutte le classi rilevanti: Path, FileSystem e FileSystemProvider.
Il modo in cui funziona è che Path restituisce un FileSystem che restituisce un FileSystemProvider - ciò che è necessario fare è modificare come si comportano i metodi FileSystemProvider.createSymbolicLink.

Il metodo createSymbolicLink riceve un argomento varargs che non viene attualmente utilizzato - è possibile passare un argomento in modo che indicherà la vostra wrapper che ha bisogno di ignorare il modo in cui vengono creati i collegamenti simbolici - e ci si va :)

Dopo aver scritto tutto questo - l'unica domanda che ho è - perché hai bisogno di questo tipo di comportamento?

+0

In realtà non c'è un grande bisogno, ho appena scoperto questo comportamento tramite un bug nel mio programma che ha causato la non creazione della destinazione del link simbolico. – ripper234

Problemi correlati