2016-07-29 5 views
0

Я написал эту функцию ниже, чтобы найти все папки под названием «Строительные документы», Я хочу, чтобы он скопировал все содержимое в другой каталог.Как скопировать одну папку с ее содержимым в другую папку в Java

 private void findDirectory(File parentDirectory, String insertDir) { 
      if(foundFolder) { 
       return; 
      } 
      File[] files = parentDirectory.listFiles(); 
      for (File file : files) { 
       if (file.isFile()) { 
        continue; 
       } 
       if (file.getName().equals("Construction Documents")) { 
        System.out.println(file.getAbsolutePath()); 
        if(file.getParent().contains("Original") || file.getParent().contains("Revision") || file.getParent().contains("R0")){ 
         new File(insertDir + file.getParent()).mkdir(); 
         try { 
        //  FileUtils.copyDirectory(new File(file), new File(insertDir + file.getParent().toString())); 
          Files.copy(file.toPath(), new File(insertDir + file.getParent().toString()).toPath()); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
       if(file.isDirectory()) { 
        findDirectory(file, insertDir); 
       } 
      } 
     } 

insertDir является Строка пути идентификатор файла хотел вставить папку. Я попытался с помощью FileUtils, однако это скопировал весь каталог более, в том числе многих родительских файлов до фактической папки строительных документов. Родная Java тоже не работала и просто приводила к ошибкам.

Короче говоря, я хотел бы скопировать одну папку со всеми ее вложенными папками и содержимым в другую папку, однако без всех родительских файлов из скопированного файла, созданного на конечной стороне.

+0

Я не думаю, что 'continue' делает то, что вы думаете. На самом деле он переходит к следующему «файлу» в цикле, а не к вашему коду. –

+0

эта часть фактически хорошо. Эта часть просто игнорирует файлы при поиске подходящей папки для копирования. – ZKayyali

ответ

1

Что-то вдоль этих линий:

Path srcDir = Paths.get("c:\\src"); 
Path dstDir = Paths.get("c:\\dst"); 
Files.walkFileTree(srcDir, new SimpleFileVisitor<Path>() { 
    @Override 
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { 
     Path dstSubDir = dstDir.resolve(srcDir.relativize(dir)); 
     Files.createDirectories(dstSubDir); 
     return FileVisitResult.CONTINUE; 
    } 

    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
     Path dstFile = dstDir.resolve(srcDir.relativize(file)); 
     Files.copy(file, dstFile); 
     return FileVisitResult.CONTINUE; 
    } 
}); 
+0

Это все еще копировало все родительские каталоги из сетевого корня. Я хотел бы скопировать только выбранную финальную папку со всеми ее подпапками и файлами. – ZKayyali

+0

Это копирует каталог в другой каталог. Там нет родительского каталога. Если вам нужно выбрать один из подкаталогов, добавьте метод 'preVisitDirectory()' с помощью 'if (! Dir.getFileName(). Equals (" w.e ")) return FileVisitResult.SKIP_SUBTREE;'. Несмотря на это, 'walkFileTree()' будет вашим другом здесь и будет производить гораздо лучший код, чем обычай для циклов. – sturcotte06

+0

Это не сработало. Возможно, потому, что im копирование с сетевого диска, а не на локальный диск? – ZKayyali