Я хочу создать символические ссылки (мягкие ссылки) из Java на компьютере с Windows Vista/2008. Я доволен идеей, что для этого мне нужно обратиться в JNI. Однако мне нужна помощь в фактическом коде C. Какой системный вызов подходит для создания ссылки? Мы будем очень признательны за ссылки на хорошую документацию по этому вопросу.
Как создать символическую ссылку в Windows Vista?
Ответы (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, поэтому, возможно, я упустил из виду некоторые тонкости этой работы...
Это было в моем списке, чтобы попробовать, из моих заметок:
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++, это 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, которые, кажется, очень довольны ею. Я был бы удивлен, если бы эта библиотека не предлагала поддержку символических ссылок.
Не могли бы вы просто вызвать командную строку и использовать mklink?