Frage

Ich bin auf der Suche Symlinks (Softlinks) von Java auf einem Windows Vista / 2008-Rechner zu erstellen. Ich bin glücklich mit der Idee, die ich brauche, um die JNI zu rufen, dies zu tun. Ich bin nach Hilfe auf dem tatsächlichen obwohl C-Code. Was ist der geeignete Systemaufruf den Link zu erstellen? Zeiger auf einige gute Dokumentation zu diesem Thema wäre sehr geschätzt.

War es hilfreich?

Lösung

Symbolische Links in Windows verwenden die CreateSymbolicLink API Funktion erstellt, die nimmt Parameter sehr ähnlich wie die Befehlszeilenargumente von dem Kommandozeilenprogramm mklink akzeptiert .

Angenommen, Sie sind richtig die JNI und Win32 SDK-Header verweisen, könnten Sie den Code somit so einfach sein wie:

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;
}

Beachten Sie, dass dies nur aus der Spitze von meinem Kopf, und ich habe nicht mit JNI in Alter behandelt, so dass ich vielleicht einige der Feinheit der Herstellung diese Arbeit ...

übersehen

Andere Tipps

Dies ist auf meiner Liste gewesen, um zu versuchen, aus meinen Notizen:

Die API:

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

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

Einige C # Beispiele:

http://community.bartdesmet.net/blogs/bart/archive/2006/10/24/Windows-Vista- 2D00 -Schaffung-symbolic-links-mit-C_2300_. aspx

Ein C ++ Beispiel wird diese aus einem anderen Artikel CNP ich las. Ich habe nicht getestet es so mit Vorsicht verwenden.

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.");
  }
}

}

Nachdem dies gesagt ist, würde ich nicht diesen Code verwenden :-) Ich würde entweder geneigt sein mklink blechen oder in der nativen Bibliothek suchen aus jruby / JPython (Sorry, ich kann es nicht atm auf, als meine Netzwerkverbindung flakey ist). Ich glaube mich zu erinnern, dass jruby eine Bibliothek geschrieben hat, die verschiedene Posix apis in java einpackt (denkt wie Chown, die für Ruby Compliance erforderlich sind, sind aber nicht Cross-Plattform). Diese Bibliothek wird von den JPython Leuten verwendet werden, die mit ihm sehr zufrieden zu sein scheinen. Ich wäre überrascht, wenn diese Bibliothek nicht sym-Link-Unterstützung bietet.

Könnten Sie nicht rufen Sie einfach an die Befehlszeile aus und verwenden Sie mklink

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top