Question

Je cherche à créer des liens symboliques (liens symboliques) à partir de Java sur une machine Windows Vista / 2008. Je suis content de l’idée que j’ai besoin d’appeler la JNI pour le faire. Je suis après l'aide sur le code C réel cependant. Quel est l'appel système approprié pour créer le lien? Des indications sur une bonne documentation sur ce sujet seraient très appréciées.

Était-ce utile?

La solution

Les liens symboliques dans Windows sont créés à l'aide de la fonction de l'API CreateSymbolicLink , qui prend des paramètres très similaires aux arguments de ligne de commande acceptés par l'utilitaire de ligne de commande Mklink .

En supposant que vous référeniez correctement les en-têtes JNI et Win32 SDK, votre code pourrait donc être aussi simple que:

JNIEXPORT jboolean JNICALL Java_ClassName_MethodName
    (JNIEnv *env, jstring symLinkName, jstring targetName)
{
    const char *nativeSymLinkName = env->GetStringUTFChars(symLinkName, 0);
    const char *nativeTargetName = env->GetStringUTFChars(targetName, 0);

    jboolean success = (CreateSymbolicLink(nativeSymLinkName, nativeTargetName, 0) != 0);

    env->ReleaseStringUTFChars(symLinkName, nativeSymLinkName);
    env->ReleaseStringUTFChars(targetName, nativeTargetName);

    return success;
}

Notez que je n’ai que très mal à la tête et que je n’ai pas traité avec JNI depuis très longtemps. J’ai donc peut-être oublié certains des aspects les plus subtils de la réalisation de ce travail ...

Autres conseils

Cela a été sur ma liste d'essayer, d'après mes notes:

L'API:

http://msdn.microsoft.com/ en-us / library / aa363866 (VS.85) .aspx

BOOLEAN WINAPI CreateSymbolicLink(
  __in  LPTSTR lpSymlinkFileName,
  __in  LPTSTR lpTargetFileName,
  __in  DWORD dwFlags
);

Quelques exemples en C #:

http://community.bartdesmet.net/blogs/bart/archive/2006/10/24/Windows-Vista- 2D00 - Création de liens symboliques avec C_2300_. aspx

Un exemple C ++, cnp d’un autre article que je lisais. Je ne l'ai pas testé, utilisez-le avec prudence.

typedef BOOL (WINAPI* CreateSymbolicLinkProc) (LPCSTR, LPCSTR, DWORD);

void main(int argc, char *argv[]) 
{
  HMODULE h;
  CreateSymbolicLinkProc CreateSymbolicLink_func;
  LPCSTR link = argv[1];
  LPCSTR target = argv[2];
  DWORD flags = 0;

  h = LoadLibrary("kernel32");
  CreateSymbolicLink_func =
    (CreateSymbolicLinkProc)GetProcAddress(h,
  if (CreateSymbolicLink_func == NULL) 
  {
     fprintf(stderr, "CreateSymbolicLinkA not available\n");
  } else 
  {
     if ((*CreateSymbolicLink_func)(link, target, flags) == 0) 
     {
        fprintf(stderr, "CreateSymbolicLink failed: %d\n",
        GetLastError());

  } else 
  {
     printf("Symbolic link created.");
  }
}

}

Cela dit, je n’utiliserais pas ce code :-) Je serais enclin à bifurquer mklink ou à regarder la bibliothèque native de jruby / jpython (désolée, je ne peux pas la regarder dans l’atmosphère, ma connexion réseau est floue). Je crois me souvenir que jruby a écrit une bibliothèque qui englobe divers apix posix dans java (pense comme chown qui sont nécessaires pour la conformité au rubis mais ne sont pas multiplateformes). Cette bibliothèque est utilisée par les gens de jpython qui semblent très satisfaits. Je serais surpris que cette bibliothèque n'offre pas de support pour les liens sym.

Ne pouvez-vous pas appeler la ligne de commande et utiliser mklink ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top