2010-05-20 17 views
1

Je veux copier un fichier .exe existant d'un répertoire à un autre et le lancer ensuite avec Java. Comme ceci:Java: la copie d'un fichier exe et le lancement par la suite échouent

FileIO.copy(new File(sourceFile), new File(targetFile)); 
System.out.println("Existing: " + new File(targetFile).exists()); 
System.out.println("Launching " + targetFile); 
String cmd[] = { targetFile }; 
Process p = Runtime.getRuntime().exec(cmd); 
p.waitFor(); 
System.out.println("Result: " + p.exitValue()); 

La sortie est comme ceci:

Existing: true 
Launching C:\test\Launcher.new.exe 
Result: 2 

Ainsi Java dit que le fichier est valide et existant, mais Windows ne peut pas lancer le processus, car il pense que le fichier n'est pas Là. Les chemins sont absolus et avec des antislashs. J'ai également toutes les permissions sur les fichiers, donc je suis autorisé à les exécuter. Le fichier Launcher.new.exe est généré par Launch4j. Il est donc plus ou moins autonome. Au moins, cela ne dépend pas des DLL dans le même dossier. Mais étrange: Cela fonctionne quand je copie et lance le notepad.exe.

Encore une chose étrange: Si je ne copie pas le fichier par Java mais à la main, le lancement échoue également avec la même erreur.

OS est Vista avec SP1.

Une idée?

+0

ProcessMonitor ne montre aucune erreur et déclare que le fichier a été lancé.Mais il ne s'est rien passé par la suite. – Philip

+0

Quel genre de processus essayez-vous de lancer? Vous pouvez être en train de tomber sur l'UAC à Vista. – mdma

+0

C'est un .exe développé par moi. Aucun UAC n'apparaît. Il n'y a pas non plus de "logiciel de sécurité" avec des trucs ressemblant à du bac à sable. – Philip

Répondre

0

Hmm ... Je me demande si cela pourrait être merveilleux accès utilisateur de Vista Controls en jeu ...

Travaillez-vous dans les fichiers du programme? Si oui, déplacez tout dans un dossier séparé (c: \ CopyTest) et réessayez - voir si cela aide ...

+0

Je suis déjà en train de tester depuis le dossier "C: \ test". Je soupçonne aussi une sorte de virtualisation bizarre, mais je ne sais pas comment le vérifier. – Philip

+0

De toute façon vous pouvez exécuter en tant qu'administrateur pour exclure toute bêtise Vista? –

+0

Je suis déjà en cours d'exécution en tant qu'administrateur. – Philip

0

Si votre chemin contient des barres obliques, vous pouvez essayer de les remplacer par des barres obliques inversées avant exec . En outre, vous devez essayer de rendre le chemin absolu, y compris une lettre de lecteur et deux points (par exemple, C:\test\myprog.exe). Notez que si vous codez le chemin dans une chaîne Java, vous devez doubler les barres obliques inverses ...

Une fois que vous avez obtenu ce résultat, vous pouvez réduire ces contraintes jusqu'à ce que vous trouviez ce qui a cassé votre tentative.


EDIT 1: Quelques pièges avec exec() sont mentionnés dans this article. Je ne pense pas que cela s'applique, mais vous pouvez utiliser le codage du dernier exemple pour exécuter votre .EXE au sein de CMD.EXE pour obtenir une résolution de chemin décent, la gestion des erreurs et autres.


EDIT 2: Le nom de votre fichier exécutable doit être interprété comme un nom de fichier long. Je ne suis pas certain que l'API puisse/va gérer cela. S'il vous plaît essayer de donner le .EXE un nom court et simple (juste pour tester) comme NEWPROG.EXE (avec pas de deuxième point dans le nom, soit!) Mais d'abord certainement essayer avec CMD.EXE d'abord.


EDIT 3: De la lecture des commentaires à l'autre réponse: Est-il possible que votre programme est en cours d'exécution en effet, et se retournant un statut de 2 parce qu'il ne parvient pas à trouver un fichier? Existe-t-il un moyen de vérifier le fonctionnement de votre programme, peut-être en l'appelant à partir d'un script de traitement par lots .CMD que vous exécutez à partir de votre programme Java et en lui envoyant une sortie d'écriture redirigée vers un fichier?

+0

Les chemins sont absolus et avec des antislashs. J'ai oublié de mentionner cela. :) – Philip

+0

Ajout du chemin actuel et du nom de fichier maintenant. – Philip

+0

Les barres obliques inverses ne sont pas importantes dans Windows. – BalusC

0

Sans plus de détails, il est difficile de donner une réponse spécifique. Vérifiez vos autorisations sur le répertoire c: \ test et les autorisations sur le fichier cible que vous essayez d'exécuter.

+0

J'aimerais ajouter plus de détails, qu'est-ce qui manque? Remplacé l'espace réservé par le chemin d'accès et le nom de fichier réels. – Philip

+0

Est-ce que l'exe dépend des dll? Sont-ils dans le même dossier? – mdma

+0

L'exe est autonome, plus ou moins. C'est généré par Launch4j. – Philip