Windows Vistaでシンボリックリンクを作成するにはどうすればよいですか?
-
10-07-2019 - |
質問
Windows Vista / 2008マシンでJavaからシンボリックリンク(ソフトリンク)を作成しようとしています。これを行うにはJNIを呼び出す必要があるという考えに満足しています。私は実際のCコードの助けを求めています。リンクを作成するための適切なシステムコールは何ですか?このテーマに関するいくつかの優れたドキュメントへのポインタをいただければ幸いです。
解決
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#の例:
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にラップするライブラリを作成したことを思い出すようです(chownのように、Ruby準拠に必要ですが、クロスプラットフォームではありません)。このライブラリは、非常に満足しているjpythonの人々によって使用されています。このライブラリがsymリンクのサポートを提供していない場合、私は驚くでしょう。
コマンドラインを呼び出して mklink を使用しませんか?