Как мне создать символическую ссылку в Windows Vista?
-
10-07-2019 - |
Вопрос
Я хочу создать символические ссылки (программные ссылки) из Java на компьютере с Windows Vista / 2008.Я доволен идеей, что мне нужно обратиться к JNI, чтобы сделать это.Однако мне нужна помощь по самому C-коду.Какой системный вызов подходит для создания ссылки?Мы были бы очень признательны за указания на какую-нибудь хорошую документацию по этому вопросу.
Решение
Символьные ссылки в Windows создаются с помощью функции API CreateSymbolicLink , параметры которого очень похожи на аргументы командной строки, принятые утилитой командной строки Mklink а>. р>
Предполагая, что вы правильно ссылаетесь на заголовки JNI и Win32 SDK, ваш код может быть таким простым: Заметьте, что это только у меня в голове, и я не имел дело с JNI целую вечность, поэтому, возможно, я упустил некоторые тонкости создания этой работы ... 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;
}
Другие советы
Это было в моем списке, чтобы попробовать, судя по моим заметкам:
API - интерфейс:
http://msdn.microsoft.com/en-us/library/aa363866 (ПРОТИВ 85).aspx
BOOLEAN WINAPI CreateSymbolicLink(
__in LPTSTR lpSymlinkFileName,
__in LPTSTR lpTargetFileName,
__in DWORD dwFlags
);
Некоторые примеры C #:
Пример 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 написал библиотеку, которая оборачивает различные posix API в java (похоже на chown, которые необходимы для соответствия ruby, но не являются кроссплатформенными).Этой библиотекой пользуются сотрудники jpython, которые, похоже, очень довольны ею.Я был бы удивлен, если бы эта библиотека не предлагала поддержку sym-ссылок.
Не могли бы вы просто вызвать командную строку и использовать mklink ?