Как создать символическую ссылку в Windows Vista?

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


person David Arno    schedule 13.10.2008    source источник


Ответы (3)


Символические ссылки в 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, поэтому, возможно, я упустил из виду некоторые тонкости этой работы...

person mdb    schedule 13.10.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
);

Некоторые примеры С#:

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 написал библиотеку, которая объединяет различные API-интерфейсы posix в java (думает, как chown, которые необходимы для соответствия Ruby, но не являются кросс-платформенными). Эта библиотека используется людьми jpython, которые, кажется, очень довольны ею. Я был бы удивлен, если бы эта библиотека не предлагала поддержку символических ссылок.

person Scott James    schedule 13.10.2008

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

person RB.    schedule 13.10.2008
comment
Нет! Я хочу использовать соответствующий вызов C/C++ напрямую. - person David Arno; 13.10.2008
comment
Справедливо. Хотя есть ли какая-то конкретная причина? Я имею в виду, есть ли функции, которые вам нужны, которые недоступны через mklink или что-то подобное? - person RB.; 13.10.2008
comment
Я упомянул это как вариант, это разумный выбор, но вы платите накладные расходы за создание процесса. - person Scott James; 13.10.2008
comment
У меня уже есть dll JNI, которую мне нужно расширить. Таким образом, просто вызов API гораздо более желателен, чем создание нового процесса для вызова отдельного приложения, беспокойство о пути к этому приложению, захват его кода возврата, чтобы узнать, произошло ли создание и т. д. - person David Arno; 13.10.2008
comment
Поразмыслив, я изменил свой голос против на голос за. Возможно, я не хочу делать это таким образом, но это не неправильный ответ и может быть полезен другим. - person David Arno; 13.10.2008