Как создать символическую ссылку в Windows Vista? - PullRequest
5 голосов
/ 13 октября 2008

Я хочу создать символические ссылки (программные ссылки) из Java на компьютере с Windows Vista / 2008. Я доволен идеей, что мне нужно обратиться в JNI, чтобы сделать это. Я после помощи по фактическому коду C, хотя. Каков соответствующий системный вызов для создания ссылки? Указатели на хорошую документацию по этому вопросу будут очень благодарны.

Ответы [ 3 ]

10 голосов
/ 13 октября 2008

Символьные ссылки в Windows создаются с помощью API-функции CreateSymbolicLink , которая принимает параметры, очень похожие на аргументы командной строки, принимаемые утилитой командной строки Mklink .

Если вы правильно ссылаетесь на заголовки JNI и Win32 SDK, ваш код может быть таким простым:

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

Обратите внимание, что это не в моей голове, и я не имел дело с JNI целую вечность, поэтому, возможно, я упустил некоторые тонкости создания этой работы ...

4 голосов
/ 13 октября 2008

Это было в моем списке, чтобы попробовать, из моих заметок:

API:

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

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

Некоторые примеры на C #:

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

Пример C ++, это cnp из другой статьи, которую я читал. Я не проверял его, поэтому используйте его с осторожностью.

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

}

Сказав это, я бы не стал использовать этот код :-) Я был бы либо склонен форк mklink, либо посмотреть на нативную библиотеку из jruby / jpython (извините, я не могу найти ее, так как мое сетевое соединение ненадежно). Кажется, я вспоминаю, что jruby написал библиотеку, которая упаковывает различные apix-файлы posix в java (похоже на chown, которые необходимы для соответствия ruby, но не являются кроссплатформенными). Эта библиотека используется людьми jpython, которые, кажется, очень довольны ею. Я был бы удивлен, если бы эта библиотека не поддерживала sym link.

3 голосов
/ 13 октября 2008

Не могли бы вы просто вызвать в командной строке и использовать mklink ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...