Déplacement de fichiers d'un répertoire à un autre, à l'aide de Java
J'ai des problèmes avec le déplacement de fichiers dans les répertoires en Java. Le problème est que je ne comprends pas pourquoi le programme se comporte de la façon dont il se comporte. Ci-dessous est une (légère) de la modification de mon programme.
Je parcourir les répertoires d'un répertoire. Dans chacun de ces répertoires parcourus
il y a des fichiers de texte, qui je veux déplacer en deux sous-répertoires de la traversée de répertoire. J'ai créer ces deux répertoires (trainingData
et testData
). Je veux 30 des fichiers à être déplacé dans la testData
répertoire et 60 dans le trainingData
répertoire. Pour ce faire, je fais deux boucles for.
Dans le code ci-dessous, j'ai mis d'abord la boucle de déplacer les fichiers dans trainingData
. Et la bonne nouvelle, c'est que tous ces 60 fichiers sont vraiment déplacés dans trainingData
. Cependant, la deuxième boucle ne semble pas faire quoi que ce soit - pas de fichier de l'un quelconque de ces 30 fichiers restants est déplacé. Ces 30 fichiers de continuer à rester dans l'original (traversé) répertoire.
De plus, quelque chose de très étrange, c'est que quand je change les deux boucles de mettre celui de déplacer le 30 fichiers sur la première place, et l'autre après celui-ci, le 30 dossiers sont correctement déplacé dans testData
, cependant, 30 des 60 autres, les fichiers sont déplacés vers le trainingData
répertoire et le reste 30 fichiers de rester dans l'original (traversé) répertoire.
Le programme ne fonctionne toujours pas faire ce que je veux (en partie seulement), cependant, ce qui me dérange, c'est que je ne comprends pas pourquoi cette différence est-elle(??) quand je change les lieux des deux boucles. Le code est identique, et devrait fonctionner de la même, n'est-ce pas?
Merci pour le temps de regarder dans le code, et si nécessaire, je suis prêt à fournir plus de code et les explications.
File[] reviews = null;
for(File sortedRevDir : sortedRevDirs) {
reviews = sortedRevDir.listFiles();
int numFiles = 90;
int numTwoThirds = 60;
int numOneThirds = numFiles - numTwoThirds;
String trainingDir = sortedRevDir.getAbsolutePath() + "/trainingData";
File trDir = new File(trainingDir);
trDir.mkdir();
String testDir = sortedRevDir.getAbsolutePath() + "/testData";
File tsDir = new File(testDir);
tsDir.mkdir();
for(int i = 0; i < numTwoThirds; i++) {
File review = reviews[i];
if(!review.isDirectory()) {
File reviewCopied = new File(trDir + "/" + review.getName());
review.renameTo(reviewCopied);
}
}
for(int j = 0; j < numOneThird; j++) {
File review = reviews[j];
if(!review.isDirectory()) {
File reviewCopied = new File(tsDir + "/" + review.getName());
review.renameTo(reviewCopied);
}
}
}
- Un style rapide suggestion: "numFiles" serait mieux comme quelque chose comme "fileQuantity". Comme il est, il pourrait être une liste de fichiers contenant des nombres, une liste de numéros associés à des fichiers, ou de quelque chose et je ne sais pas, sans regarder à la déclaration. numOneThird serait plus simple que juste numFiles / 3 et numTwoThirds serait plus simple que numFiles * 2 / 3. Tout ce que vous avez faire est de remplacer un rapport mathématique avec la même mention dans les mots. Idéalement, le nom de la variable doit donner une indication quant à POURQUOI vous êtes divisant 90 en groupes.
- Merci, je vais le prendre à l'esprit.
Vous devez vous connecter pour publier un commentaire.
Faire la deuxième boucle comme suit:
Le problème est que, dans les deux boucles, vous indexer le même
array
deFile
s. Lorsque vous déplacez le fichier, il n'est pas retiré de la baie. Simplement, il y reste. Dans la seconde boucle, il essaie de déplacer des fichiers qui ont déjà été déplacés. C'est pourquoi, dans la seconde boucle, votre variable d'index doit continuer à partir de la valeur finale de la première boucle.Cela explique aussi pourquoi, lors de l'échange de deux boucles, à seulement 30 fichiers sont copiés à partir du répertoire d'origine: les 30 premiers sont ignorés parce qu'ils ont déjà été copiés; les 30 autres sont copiés comme prévu.
Alternativement, vous pourriez faire un autre
reviews = sortedRevDir.listFiles();
entre les deux boucles de garder les boucles plus simple, mais c'est un peu du gaspillage de performance, puisque c'est une autre opération e /s qui n'est pas vraiment nécessaire.Garder à l'esprit que la Fichier.renameTo(dest) mai (probablement) d'échouer si votre répertoire de destination n'est pas sur le même système de fichiers.
Dans ce cas, vous aurez besoin de mettre en œuvre une copie et la suppression de la sémantique;