2012-09-20 34 views
6

Estoy usando Oracle Java 7 en Windows 64 bit.¿Cómo forzar a Java 7 a crear "enlaces simbólicos de directorios" en Windows en lugar de "enlaces simbólicos de archivos"?

Cuando se crea un enlace simbólico utilizando Files.createSymbolicLink, noto este comportamiento:

  1. Si el destino es un directorio, un "directorio de enlaces simbólicos" se crea.
  2. Si el destino es un archivo, se crea un "enlace simbólico de archivo".
  3. Si el destino no existe, se crea un "enlace simbólico de archivo".

The type of the symlink is fixed and never changes, independientemente de cualquier cambio en su objetivo.

Usando el comando nativo mklink de Windows, es posible forzar el tipo de enlace para que sea un "enlace simbólico de directorio". ¿Es posible lograr esto usando la API Java nativa o alguna biblioteca?

Una forma trivial y fea es:

  1. Si el destino es un directorio, basta con crear el enlace
  2. Si no existe el objetivo, crear un nuevo directorio de destino vacío, crear el enlace, y borra el directorio.
  3. Si el objetivo es un archivo ... manejarlo (moverlo, aplicar # 2, moverlo hacia atrás).

Fugly.

Respuesta

2

Desafortunadamente, no veo la manera de hacerlo en las API de Java.

he comprobado el código de Windows JRE y parece que la decisión se basa en el archivo sí mismos atributos:

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

El atribuye a sí mismos se originan a partir código nativo, y parece que no hay manera de afectarlos.

Claramente tiene otras opciones como invocar manualmente mklink o incluso manipular los objetos devueltos usando algo como PowerMock (que claramente no es para este propósito).

Otra opción sucia es crear proxys de todas las clases relevantes: Path, FileSystem y FileSystemProvider.
La forma en que funciona es que el Path devuelve un FileSystem que devuelve un FileSystemProvider - lo que debe hacer es modificar cómo se comporta el método FileSystemProvider.createSymbolicLink.

El método createSymbolicLink recibe un argumento varargs que actualmente no se utiliza - se puede pasar un argumento a ella que le indique su envoltorio que necesita para anular el modo en que se crean los enlaces simbólicos - y hay que ir :)

Después de escribir todo esto, la única pregunta que tengo es: ¿por qué necesita este tipo de comportamiento?

+0

En realidad no hay una gran necesidad, acabo de descubrir este comportamiento a través de un error en mi programa que hizo que no se creara el destino del enlace simbólico. – ripper234

Cuestiones relacionadas