代码之家  ›  专栏  ›  技术社区  ›  David Arno

如何在Windows Vista中创建符号链接?

  •  5
  • David Arno  · 技术社区  · 16 年前

    我想在Windows Vista/2008机器上创建Java的SysLink(软链接)。我很高兴我需要打电话给JNI来做这件事。不过,我在寻求实际C代码的帮助。创建链接的适当系统调用是什么?对于这方面的一些好的文档,我们将非常感谢。

    3 回复  |  直到 13 年前
        1
  •  10
  •   mdb    16 年前

    Windows中的符号链接是使用 CreateSymbolicLink API Function ,其参数与接受的命令行参数非常相似 the Mklink command line utility .

    假设您正确地引用了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的年龄,所以我可能忽略了一些微妙的点,使这项工作…

        2
  •  4
  •   Scott James    16 年前

    从我的笔记来看,这已经在我的列表中尝试过了:

    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上查看它)。我似乎记得JRuby已经编写了一个将各种POSIX API封装到Java中的库(像Ruby一样需要Ruby遵从而不是跨平台)。这个图书馆正被JPython人使用,他们似乎对此很满意。如果这个库不提供sym链接支持,我会很惊讶。

        3
  •  3
  •   RB.    16 年前

    你不能直接呼叫命令行使用 MKLink ?