Problème avec les fichiers de copie utilisant cmd en Java

J’essaie de copier un tas de fichiers avec une extension spécifique d’un dossier à un autre en utilisant la commande de copy , heres wat im

  Ssortingng[] command = new Ssortingng[3]; command[0] = "cmd"; command[1] = "/c"; command[2] = "copy C:\\output\\html\\*.txt C:\\output\\"; ProcessBuilder copyFiles = new ProcessBuilder(command); p = copyFiles.start(); p.waitFor(); 

le fait est que ce code fonctionne bien pour des fichiers de moins de 5 ou plus, mais arrête de répondre lorsque le nombre de fichiers est supérieur (même pour 15 fichiers) !! et les fichiers ne sont pas copiés non plus !! Je ne sais pas quel est le problème, sera heureux si quelqu’un pourrait aider! 🙂

Vous ne lisez pas la sortie générée par la commande de copy .

Lors de la génération d’un processus enfant à l’aide de ProcessBuilder, la sortie générée par votre processus enfant est écrite dans un tampon. Si ce tampon n’est pas lu, il finit par se remplir. Quand elle se remplit, la commande de copy ne peut plus y écrire et est donc bloquée par le système d’exploitation. Il est alors obligé d’attendre que de l’espace soit créé dans le tampon en le lisant.

J’ai couru votre code avec 20 fichiers et j’ai constaté qu’il était effectivement bloqué.

Une façon de résoudre votre problème consiste à redirect la sortie de la copy vers NUL . La majeure partie de la sortie de copy est une liste de tous les fichiers copiés, pour lesquels vous ne vous souciez probablement pas trop. Pour effectuer cette redirection, modifiez la ligne qui assigne à la command[2] comme suit:

 command[2] = "copy C:\\output\\html\\*.txt C:\\output\\ >NUL 2>NUL"; 

Toutefois, si vous rencontrez un problème lors de la copie de fichiers, vous ne le saurez peut-être pas.

Vous pouvez également lire la sortie générée par la commande de copy . Le code suivant l’envoie à System.out , mais vous pouvez facilement l’envoyer ailleurs ou l’ignorer complètement si vous le souhaitez:

 Ssortingng[] command = { "cmd", "/c", "copy C:\\output\\html\\*.txt C:\\output\\" }; ProcessBuilder copyFiles = new ProcessBuilder(command); copyFiles.redirectErrorStream(true); p = copyFiles.start(); // The InputStream we get from the Process reads from the standard output // of the process (and also the standard error, by virtue of the line // copyFiles.redirectErrorStream(true) ). BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); Ssortingng line; do { line = reader.readLine(); if (line != null) { System.out.println(line); } } while (line != null); reader.close(); p.waitFor(); 

J’ai donné à chaque approche un test rapide avec les mêmes 20 fichiers et ni l’une ni l’autre approche.

EDIT : Vous pouvez également essayer une approche «hybride» en rejetant ce que la copy écrit sur la sortie standard (par exemple la liste des fichiers copiés) mais en utilisant la seconde approche pour lire ce qu’elle écrit dans l’erreur standard ). Pour ce faire, vous ajoutez le >NUL , qui redirige la sortie standard de la copy vers NUL , mais vous n’ajoutez pas le 2>NUL , car cela redirige l’erreur standard vers NUL .