2015-12-18 1 views
0

J'essaie de transférer des fichiers d'un répertoire à un autre. Je suis actuellement en utilisant cette méthode pour accomplir cette tâche:Remplacer le répertoire entier en ignorant les fichiers en double

File srcDir = new File("path\to\file"); 
File destDIr = new File("path\to\file"); 
File.Utils.copyDirectory(srcDir, destDir); 

Mais ce que je veux est de ne pas écraser les fichiers qui existent déjà dans le DestDir avec les fichiers du SRCDIR.

Par exemple, si j'ai un struct fichier comme:

├───srcDir 
│ ├───this.txt 
│ ├───hello.txt 
│ ├───main.java 

├───destDir 
│ ├───this.txt 

Je veux copier hello.txt et main.java mais je ne veux pas copier/mise à jour/remplacer this.txt

Je pensais que je pouvais il suffit de vérifier si le fichier existe avec quelque chose comme

if(f.exists() && !f.isDirectory())

mais cela semble un peu hacky et ne fonctionne pas comme je l'ai prévu.

Je suis à la recherche d'un moyen commun et simple de le faire, merci.

Existe-t-il une solution qui pourrait également fonctionner avec les sous-répertoires?

+0

Votre code sera beaucoup plus robuste si vous utilisez le [java.nio.file] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/package -summary.html) à la place de la classe java.io.File de 20 ans. Et vous trouverez que la classe 'Files' a un certain nombre de méthodes" walk "qui traversent une arborescence récursivement. – VGR

+0

peut-être essayer de préparer deux ensembles de noms et effectuer un complément logique, comme diff = a.clone(); diff.removeAll (b); –

+0

@VGR J'essayais cela avant mais je reçois une exception filealreadyexists –

Répondre

-1

Vous pouvez essayer avec ce code. Ça marche pour moi.

public class CopyDirectoryWithoutOverWritting 
{ 
    public static void main(String[] args) 
    { 
     File srcFolder = new File("C:/Users/Usuarioç/Desktop/FACHA"); 
    File destFolder = new File("C:/Users/Usuarioç/Desktop/OTRO"); 
    //make sure source exists 
    if(!srcFolder.exists()){ 

     System.out.println("Directory does not exist."); 
     //just exit 
     System.exit(0); 

    }else{ 

     try{ 
     copyFolder(srcFolder,destFolder); 
     }catch(IOException e){ 
     e.printStackTrace(); 
     //error, just exit 
     System.exit(0); 
     } 
    } 

    System.out.println("Done"); 
} 

public static void copyFolder(File src, File dest) 
    throws IOException{ 

    if(src.isDirectory()){ 

     //if directory not exists, create it 
     if(!dest.exists()){ 
      dest.mkdir(); 
      System.out.println("Directory copied from " 
          + src + " to " + dest); 
     } 

     //list all the directory contents 
     String files[] = src.list(); 

     for (String file : files) { 
      //construct the src and dest file structure 
      File srcFile = new File(src, file); 
      File destFile = new File(dest, file); 
      if(!destFile.isDirectory() && !destFile.exists()){ 
       //recursive copy 
       copyFolder(srcFile,destFile); 
      } 
     } 

    }else{ 
     //if file, then copy it 
     //Use bytes stream to support all file types 
     InputStream in = new FileInputStream(src); 
      OutputStream out = new FileOutputStream(dest); 

      byte[] buffer = new byte[1024]; 

      int length; 
      //copy the file content in bytes 
      while ((length = in.read(buffer)) > 0){ 
       out.write(buffer, 0, length); 
      } 

      in.close(); 
      out.close(); 
      System.out.println("File copied from " + src + " to " + dest); 
    } 
} 
}