6

我希望在 Windows Vista/2008 机器上从 Java 创建符号链接(软链接)。我很高兴我需要调用 JNI 来执行此操作。不过,我正在寻求实际 C 代码的帮助。创建链接的适当系统调用是什么?非常感谢有关此主题的一些好的文档的指针。

4

3 回答 3

10

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 了,所以我可能忽略了使这项工作的一些更好的点......

于 2008-10-13T12:38:15.830 回答
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# 示例:

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.");
  }
}

}

话虽如此,我不会使用这段代码 :-) 我要么倾向于 fork mklink,要么从 jruby/jpython 中查看本机库(抱歉,我无法在 atm 上查找它,因为我的网络连接很不稳定)。我似乎记得 jruby 已经编写了一个库,它将各种 posix apis 包装到 java 中(就像 chown 一样,它是 ruby​​ 合规性所必需的,但不是跨平台的)。jpython 人正在使用这个库,他们似乎对此非常满意。如果这个库不提供符号链接支持,我会感到惊讶。

于 2008-10-13T12:34:21.703 回答
3

您不能直接调用命令行并使用mklink吗?

于 2008-10-13T12:23:56.373 回答