我希望在Windows Vista / 2008计算机上从Java创建符号链接(软链接)。我很高兴我需要呼吁JNI这样做。我虽然在实际的C代码上寻求帮助。创建链接的适当系统调用是什么?非常感谢有关此主题的一些好文档的指示。
答案 0 :(得分:10)
Windows中的符号链接是使用CreateSymbolicLink API Function创建的,the Mklink command line utility的参数与{{3}}接受的命令行参数非常相似。
假设您正确引用了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,所以我可能忽略了使这项工作变得更精细的一些......
答案 1 :(得分:4)
这已经在我的名单上尝试,从我的笔记:
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#示例:
一个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 apis包装到java中(认为像ruby一致但不是跨平台所需的chown)。这个库正被jpython人们使用,他们似乎非常满意。如果这个库不提供sym链接支持,我会感到惊讶。
答案 2 :(得分:3)
难道你不能只是呼叫命令行并使用 mklink 吗?