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