Pergunta

Eu estou olhando para criar links simbólicos (soft links) de Java em um Windows Vista / máquina de 2008. Estou feliz com a idéia de que eu preciso chamar para o JNI para fazer isso. Estou depois de ajuda no entanto código C real. O que é a chamada de sistema apropriado para criar o link? Ponteiros para uma boa documentação sobre este assunto seria muito apreciado.

Foi útil?

Solução

Os links simbólicos no Windows são criados usando o CreateSymbolicLink API Função , que tem parâmetros muito semelhantes aos argumentos de linha de comando aceites pela o utilitário Mklink linha de comando .

Assumindo que você está fazendo referência corretamente os cabeçalhos JNI e Win32 SDK, seu código poderia, assim, ser tão simples como:

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;
}

Note que este é apenas fora do topo da minha cabeça, e eu não tenho lidado com JNI em idades, para que eu possa ter esquecido alguns dos pontos mais delicados de fazer este trabalho ...

Outras dicas

Este tem sido na minha lista para tentar, de minhas notas:

A API:

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

BOOLEAN WINAPI CreateSymbolicLink(
  __in  LPTSTR lpSymlinkFileName,
  __in  LPTSTR lpTargetFileName,
  __in  DWORD dwFlags
);

Alguns exemplos C #:

http://community.bartdesmet.net/blogs/bart/archive/2006/10/24/Windows-Vista- 2D00 -Criar-symbolic-links-com-C_2300_. aspx

A Exemplo C ++, este é cnp de outro artigo eu estava a ler. Eu não testei para usá-lo com cautela.

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.");
  }
}

}

Dito isto, eu não iria usar este código :-) Eu teria quer ser inclinado para mklink garfo ou olhar para a biblioteca nativa de jruby / JPython (Desculpe eu não posso procurá-lo atm como minha conexão de rede é flakey). Eu me lembro que jruby tem escrito uma biblioteca que embrulha-se várias APIs POSIX em java (pensa como chown que são necessários para o cumprimento ruby, mas não são multi-plataforma). Esta biblioteca está sendo usado pelas pessoas JPython que parecem muito satisfeito com ele. Eu ficaria surpreso se esta biblioteca não oferece suporte ligação sym.

Não foi possível que você acabou de chamar a linha de comando e uso mklink ?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top