我期望在Windows Vista / 2008计算机上从Java创build符号链接(软链接)。 我很高兴这个想法,我需要打电话给JNI来做到这一点。 虽然我是在实际的C代码后帮助。 什么是适当的系统调用来创build链接? 指向这个问题的一些很好的文档将非常感激。
Windows中的符号链接是使用CreateSymbolicLink API函数创建的,该函数的参数与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#的例子:
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看本地库(对不起,我无法查看atm,因为我的网络连接是flakey)。 我似乎记得,jruby写了一个库,将各种posix apis封装到java中(认为它是ruby遵从性所需的chown,但不是跨平台的)。 这个图书馆正在被看似非常满意的jpython人使用。 如果这个库不提供sym链接支持,我会感到惊讶。
难道你只是打电话到命令行并使用mklink ?