2010-09-14 4 views
0

Je suis en cours d'exécution d'un programme de Windows à partir de Java:l'accès aux fichiers créés par le processus d'exécution Java

  String command = "cmd /C start "+fileName+".bat"; 
    Runtime rt = Runtime.getRuntime(); 
    Process pr = rt.exec(command, null, new File(currWD)); 
    int exitValue = pr.waitFor(); 

Le programme se termine avec succès (exitValue == 0) et crée un fichier « fileName » dans le répertoire de travail. Je suis en train de la même routine pour trouver la taille de ce fichier:

xmlFileSize = (new File(fileName)).length(); 

Java trouve le fichier mais il semble être vide (xmlFileSize == 0). Une fois que Java a fini, je peux voir, cependant, que le fichier n'est pas vide.

Comment puis-je résoudre ce problème? Tout ce que je veux, c'est que Java puisse évaluer correctement la taille du fichier créé par le programme Windows que Java a exécuté.

+0

Si vous mettez le programme en pause après 'pr.waitFor()' pouvez-vous voir le fichier et le contenu d'un autre programme, par exemple le bloc-notes? – aioobe

+1

Sur une note distincte, essayez d'utiliser la nouvelle classe ProcessBuilder au lieu de Runtime.exec. – dogbane

+0

merci, aioobe! – Nick

Répondre

0

Je créditer cette réponse à aioobe et John. Comme le suggère John, le programme externe démarré par le fichier séquentiel génère un processus qui semble fonctionner pendant un certain temps (50-300 millisec) après le retour du sous-processus Java exécutant le fichier batch. J'ai résolu le problème en introduisant une pause (comme suggéré par aioobe):

int exitValue = pr.waitFor();

try {Thread.currentThread() dormir (300).} Catch (e InterruptedException) {e.printStackTrace();}

Après la pause Java semble être en mesure de voir les fichiers créés par le programme externe. Merci encore aux deux contributeurs qui m'ont aidé à résoudre ce problème!

Si quelqu'un trouve une solution plus élégante, s'il vous plaît, n'hésitez pas à poster.

+1

C'est ce que j'essayais d'obtenir avec mon post ci-dessus, que le processus de création de fichiers se termine après que Java est déjà retourné dans le pr.waitFor(). Le problème ici est que votre valeur de sommeil est arbitraire en fonction de ce que vous voyez en ce moment. Si la commande native que vous exécutez le shell prend plus de temps pour une raison quelconque, vous aurez toujours un problème. –

+0

Oui, j'ai juste une exception "Fichier non trouvé". Il semble que cela soit fait en boucle comme le suggère aioobe. – Nick

1

Un fichier de longueur nulle indique que le fichier n'existe peut-être pas. À partir des documents:

La longueur, en octets, du fichier dénoté par ce chemin d'accès abstrait, ou 0L si le fichier n'existe pas.

Notez que vous utilisez currWD comme répertoire de travail pour votre fichier bat. Vous pouvez essayer de faire:

new File(currWD, fileName).length() 

pour vous assurer que vous recherchez le fichier dans le bon répertoire.

+0

Très bon commentaire! Je suis passé à Fichier temp = nouveau Fichier (currWD, nomFichier) .length(), puis vérifié temp.exists() et Java affiche FALSE.Pourtant, les fichiers existent - comme je l'ai noté dans un de mes précédents commentaires ci-dessus, je peux ouvrir les fichiers dans le bloc-notes tout en introduisant une pause dans le programme Java – Nick

+0

Vous cherchez probablement au mauvais endroit. Faites un System.out.println (nouveau fichier (currWD, nomfichier)) pour voir exactement où il cherche le fichier. – aioobe

+0

Non, l'endroit est correct. Je l'ai vérifié en sortant temp.getCanonicalPath(), en le copiant dans l'invite de commande en tant que "notepad {chemin canonique copié}" et en voyant le contenu du fichier dans le bloc-notes pendant que Java est en pause (et montrant que le fichier n'existe pas) – Nick

1

Cela a probablement à voir avec l'exécution du fichier bat à partir d'un shell de commande. Que fait le fichier bat? Est-ce qu'il lance un programme?

Je suppose que le script appelle ou exécute un autre programme et renvoie ce qui permet au shell de mourir. Ceci, à son tour, laisse le processus Java se poursuivre alors que le processus du script continue à s'exécuter de manière asynchrone. Selon l'API Java pour le processus, cela est autorisé ce qui devrait certainement être (link java.lang.Process)

+0

oui, le fichier bat lance un programme séparé (je pense qu'il est écrit en C++ ou C). Le contenu du fichier batch est: "{nom du programme}> nom_fichier.log 2 <& 1 EXIT" (ce sont deux lignes de code, la dernière est "EXIT") – Nick

+0

En fait, je ne comprends pas comment cette réponse s'applique à la question que j'ai posée (j'ai voté pour cela car il devinait correctement ce que fait le fichier bat). Je me répète mais ce qui se passe est (1) le code Java exécute le fichier bat (2) le fichier bat appelle un programme (3) le programme crée des fichiers (4) le fichier bat sort (5) le processus qui a démarré la chauve-souris Le fichier se ferme sans erreur mais la routine ne peut pas voir les fichiers créés à l'étape (3) même si le Bloc-notes peut les voir. Je ne suis pas sûr de la façon dont la réponse ci-dessus éclaire la situation mais je pourrais manquer quelque chose (excuses si c'est le cas!). – Nick

Questions connexes