2008-10-13 89 views
5

我期待在Windows Vista/2008計算機上從Java創建符號鏈接(軟鏈接)。我很高興這個想法,我需要致電JNI來做到這一點。儘管我在實際C代碼的幫助後。什麼是適當的系統調用來創建鏈接?指向這個問題的一些很好的文檔將非常感激。如何在Windows Vista中創建符號鏈接?

回答

10

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,所以我可能忽略了使這項工作的一些細節點...

3

難道你只是打電話到命令行並使用mklink

+0

不!我希望直接使用適當的C/C++調用。 – 2008-10-13 12:30:41

+0

夠公平的。有什麼具體的原因嗎?我的意思是,您需要的功能是否通過mklink或類似功能無法使用? – 2008-10-13 12:36:35

4

這一直是我的名單上的嘗試,從我的筆記:

的API:

http://msdn.microsoft.com/en-us/library/aa363866(VS.85).aspx

​​

一些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鏈接支持,我會感到驚訝。