2017-03-28 1 views
1

J'ai un répertoire contenant un ensemble de sous-répertoires chacun contenant plusieurs fichiers texte. Chacun des sous-répertoires contient un fichier texte qui partage le même nom que le sous-répertoire qui le contient; Je veux ajouter le contenu de ce fichier à tous les autres fichiers texte, à l'exception de celui qui partage le nom avec le sous-répertoire, et je veux le faire en java.Ajouter du texte à plusieurs fichiers dans des répertoires avec des conditions (Java)

Par exemple étant donné le dir "a", contenant les sous-répertoires "b", "c", "d", contenant respectivement les fichiers "b", "e", "f" et "c", "g" , "h", et "d", "i", "j", je veux avoir le répertoire "a" contenant les sous-répertoires "b", "c", "d" contenant respectivement les fichiers "b", "b + e "," b + f ", et" c "," c + g "," c + h ", et" d "," d + i "," d + j ", et éventuellement la suppression des fichiers ajoutés, ce sont les fichiers "a", "b", "c".

final File folder = new File("/path-of-directory/"); 

public static void listFilesForFolder(final File folder) { 
    for (final File fileEntry : folder.listFiles()) { 
     if (fileEntry.isDirectory()) { 
      listFilesForFolder(fileEntry); 
     } else if (fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())) 

       // found the file wich content has to be added to other files in the same directory. How to? 
     } 
} 
+1

d'abord vous devrez essayer d'écrire un code, puis le partager avec nous si vous rencontrez des problèmes spécifiques. – aUserHimself

+0

final Dossier de fichier = nouveau fichier ("/ chemin-de-répertoire /"); listFilesForFolder public static void (dernier dossier du fichier) { pour (finale fileentry du fichier: folder.listFiles()) { if (fileEntry.isDirectory()) { listFilesForFolder (fileentry); } else if (fileEntry.getName() substring. (0, fileEntry.getName(). LastIndexOf ("")). ToLowerCase(). Equals (folder.getName() toLowerCase().)) \t \t \t // a trouvé le fichier dont le contenu doit être ajouté à d'autres fichiers dans le même répertoire. Comment? }} – Kyle

+0

S'il vous plaît modifier votre réponse à jour avec des informations supplémentaires (comme le code ci-dessus) et ne pas oublier de le formater. – aUserHimself

Répondre

0

Cette solution a fonctionné très bien pour moi, assurez-vous de lire les commentaires pour plus de détails:

public class FileCopy { 

    public static void recursivelyCopyContent(final File folder) { 
     for (final File fileEntry : folder.listFiles()) { 
      if (fileEntry.isDirectory()) { 
       recursivelyCopyContent(fileEntry); 
      } else if (fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())) { 
       // just pass the folder and the file to the method that will do the actual content copy 
       copyContent(folder, fileEntry); 
      } 
     } 
    } 

    public static void copyContent(final File folder, final File fileName) { 
     try { 
      // get the byte[] content of the source file 
      byte[] fileContent = Files.readAllBytes(fileName.toPath()); 
      for (final File fileEntry : folder.listFiles()) { 
       // only select files with a different absolute path than the source one 
       if(fileEntry.isFile() && !fileEntry.getAbsolutePath().equals(fileName.getAbsolutePath())) { 
        // append contents from source to destination file 
        Files.write(fileEntry.toPath(), fileContent, StandardOpenOption.APPEND); 
       } 
      } 
     }catch (IOException e) { 
      e.getStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     final File folder = new File("/path-of-directory/"); 
     FileCopy.recursivelyCopyContent(folder); 
    } 
} 

Juste faire attention aux fichiers sans extension: votre condition

fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase()) 

jetteront java.lang.StringIndexOutOfBoundsException car aucun caractère . existe dans leur nom.

Dans ce cas, je suggère l'approche suivante:

// both cases covered: files have or do not have an extension 
if (
    (!fileEntry.getName().contains(".") && fileEntry.getName().toLowerCase().equals(folder.getName().toLowerCase())) || 
    (fileEntry.getName().contains(".") && fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())) 
) 
+0

Votre solution fonctionne très bien, sauf pour l'appel à "listFilesForFolder" qui était l'ancien nom de la méthode. Le remplacer avec récursiveCopyContent et en changeant la signature fonctionne bien pour moi aussi. – Kyle

+0

J'ai juste essayé d'ajouter un nom plus suggestif. Vous êtes libre de le changer si vous le souhaitez, ce n'était pas un problème. – aUserHimself

+0

je voulais dire le listFilesForFolder d'appel (fileentry) sur la cinquième ligne de votre solution, Wich devrait être recursivelyCopyContent (fileentry) parce que le nom de la méthode récursive est plus « listFilesForFolder ». – Kyle