Windows Vista에서 Symlink를 어떻게 작성합니까?
-
10-07-2019 - |
문제
Windows Vista/ 2008 시스템에서 Java에서 Symlinks (Soft Links)를 만들려고합니다. 나는 이것을하기 위해 JNI에 전화해야한다는 생각에 만족합니다. 그래도 실제 C 코드에 대한 도움을받습니다. 링크를 만들기위한 적절한 시스템 호출은 무엇입니까? 이 주제에 대한 좋은 문서에 대한 지침은 대단히 감사 할 것입니다.
해결책
Windows의 기호 링크는 The를 사용하여 작성됩니다 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# 예제 :
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.");
}
}
}
이것을 말하면서, 나는이 코드를 사용하지 않을 것입니다 :-) 나는 jruby/jpython에서 mklink를 포크하거나 기본 라이브러리를 보는 경향이 있습니다 (네트워크 연결이 칙칙하기 때문에 ATM을 찾을 수 없습니다). Jruby가 다양한 POSIX API를 Java로 마무리하는 도서관을 작성했음을 기억하는 것 같습니다 (Ruby 준수에 필요한 Chown과 같은 생각이지만 크로스 플랫폼은 아닙니다). 이 라이브러리는 매우 만족하는 Jpython 사람들이 사용하고 있습니다. 이 라이브러리가 Sym Link 지원을 제공하지 않으면 놀랄 것입니다.
명령 줄을 호출하고 사용할 수 없습니까? mklink?