Copiar archivos de un directorio a otro en Java

156

Quiero copiar archivos de un directorio a otro (subdirectorio) usando Java. Tengo un directorio, dir, con archivos de texto. I itero sobre los primeros 20 archivos en dir, y quiero copiarlos a otro directorio en el directorio dir, que he creado justo antes de la iteración. En el código, quiero copiar el review(que representa el i-ésimo archivo de texto o revisión) en trainingDir. ¿Cómo puedo hacer esto? Parece que no hay tal función (o no pude encontrar). Gracias.

boolean success = false;
File[] reviews = dir.listFiles();
String trainingDir = dir.getAbsolutePath() + "/trainingData";
File trDir = new File(trainingDir);
success = trDir.mkdir();
for(int i = 1; i <= 20; i++) {
    File review = reviews[i];

}
usuario42155
fuente
Entonces, ¿tiene un directorio lleno de archivos y solo desea copiar estos archivos? No hay recursión en el lado de entrada, por ejemplo, ¿copiar todo desde subdirectorios en un directorio principal?
akarnokd
Sí exactamente. Estoy interesado en copiar o mover estos archivos a otro directorio (aunque en la publicación solo solicité copiar).
user42155
3
Actualización del futuro. Java 7 tiene una característica de la clase Archivos para copiar archivos. Aquí hay otra publicación al respecto stackoverflow.com/questions/16433915/…
KevinL

Respuestas:

170

Por ahora esto debería resolver tu problema

File source = new File("H:\\work-temp\\file");
File dest = new File("H:\\work-temp\\file2");
try {
    FileUtils.copyDirectory(source, dest);
} catch (IOException e) {
    e.printStackTrace();
}

FileUtilsclase de la biblioteca apache commons-io , disponible desde la versión 1.2.

El uso de herramientas de terceros en lugar de escribir todas las utilidades por nuestra cuenta parece ser una mejor idea. Puede ahorrar tiempo y otros recursos valiosos.

Arun P Johny
fuente
FileUtils no funcionó para mí. fuente que tomé como "E: \\ Users \\ users.usr" y el destino como "D: \\ users.usr". ¿Cual podría ser el problema?
JAVA
2
Buena solución, para mí, funciona cuando cambio FileUtils.copyDirectory(source,dest)a FileUtils.copyFile(source, dest), esto puede crear un directorio si no existe
yuqizhang
FileUtils.copyDirectory solo copia archivos en el directorio, no en subdirectorios. FileUtils.copyDirectoryStructure copia todos los archivos y subdirectorios
Homayoun Behzadian
41

No existe un método de copia de archivos en la API estándar (todavía). Sus opciones son:

  • Escríbalo usted mismo, usando un FileInputStream, un FileOutputStream y un búfer para copiar bytes de uno a otro, o mejor aún, use FileChannel.transferTo ()
  • FileUtils del usuario Apache Commons
  • Espere NIO2 en Java 7
Michael Borgwardt
fuente
+1 para NIO2: estoy experimentando con NIO2 / Java7 en estos días ... y el nuevo Path está muy bien diseñado
dfa
OK, ¿cómo hacerlo en Java 7? El enlace NIO2 ahora está roto.
ripper234
55
@ ripper234: enlace fijo. Tenga en cuenta que encontré el nuevo enlace ingresando "java nio2" en Google ...
Michael Borgwardt
Para el enlace de Apache Commons, creo que querías vincular a "#copyDirectory (java.io.File, java.io.File)"
kostmo
37

En Java 7, no es un método estándar para copiar archivos en Java:

Files.copy.

Se integra con E / S nativas de E / S para un alto rendimiento.

¿Ver mi A en forma concisa estándar para copiar un archivo en Java? para una descripción completa del uso.

Glen Best
fuente
66
Esto no aborda la cuestión de copiar directorios completos.
Charlie
Sí, lo hace ... si sigues el enlace. No olvide que un "Archivo" en java puede representar un directorio o archivo, es solo una referencia.
gagarwa
"Si el archivo es un directorio, crea un directorio vacío en la ubicación de destino (las entradas en el directorio no se copian)"
yurez
27

El siguiente ejemplo de Java Tips es bastante sencillo. Desde entonces he cambiado a Groovy para operaciones relacionadas con el sistema de archivos, mucho más fácil y elegante. Pero aquí está el Java Tips que usé en el pasado. Carece del manejo robusto de excepciones que se requiere para que sea infalible.

 public void copyDirectory(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i=0; i<children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        new File(targetLocation, children[i]));
            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetLocation);

            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        }
    }
Brian
fuente
Gracias, pero no quiero copiar el directorio, solo los archivos que contiene. Ahora recibo mensajes de error java.io.FileNotFoundException: (la ruta a trDir) (Es un directorio) Esto es lo que solo dice. He utilizado el método de esta manera: copyDirectory (review, trDir);
user42155
Gracias, mejor para comprobar si sourceLocation.exists()en el caso de prevenirjava.io.FileNotFoundException
Sdghasemi
19

Si desea copiar un archivo y no moverlo, puede codificar así.

private static void copyFile(File sourceFile, File destFile)
        throws IOException {
    if (!sourceFile.exists()) {
        return;
    }
    if (!destFile.exists()) {
        destFile.createNewFile();
    }
    FileChannel source = null;
    FileChannel destination = null;
    source = new FileInputStream(sourceFile).getChannel();
    destination = new FileOutputStream(destFile).getChannel();
    if (destination != null && source != null) {
        destination.transferFrom(source, 0, source.size());
    }
    if (source != null) {
        source.close();
    }
    if (destination != null) {
        destination.close();
    }

}
Janusz
fuente
Hola, he intentado esto, pero obtengo mensajes de error: java.io.FileNotFoundException: ... ruta a trDir ... (Es un directorio) Todo en mi archivo y carpetas parece estar bien. ¿Sabes qué va mal y por qué me sale esto?
user42155
Pero, ¿no hay un error de Windows alrededor de la transferencia? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4938442 arreglo rgagnon.com/javadetails/java-0064.html
akarnokd
Estoy usando Ubuntu 8.10, por lo que este no debería ser el problema.
user42155
Si está seguro de que su código nunca se ejecutará en una plataforma diferente.
akarnokd
@gemm, el archivo de destino debe ser la ruta exacta donde se debe copiar el archivo. Esto significa incluir el nuevo nombre de archivo no solo el directorio en el que desea copiar el archivo.
Janusz
18

Spring Framework tiene muchas clases de utilidades similares como Apache Commons Lang. Entonces alli estaorg.springframework.util.FileSystemUtils

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);
Igor Rybak
fuente
15

apache commons Fileutils es útil. puedes hacer debajo de las actividades.

  1. copiando el archivo de un directorio a otro directorio.

    utilizar copyFileToDirectory(File srcFile, File destDir)

  2. copiando el directorio de un directorio a otro directorio.

    utilizar copyDirectory(File srcDir, File destDir)

  3. copiar contenidos de un archivo a otro

    utilizar static void copyFile(File srcFile, File destFile)

Balaswamy Vaddeman
fuente
9
File sourceFile = new File("C:\\Users\\Demo\\Downloads\\employee\\"+img);
File destinationFile = new File("\\images\\" + sourceFile.getName());

FileInputStream fileInputStream = new FileInputStream(sourceFile);
FileOutputStream fileOutputStream = new FileOutputStream(
                destinationFile);

int bufferSize;
byte[] bufffer = new byte[512];
while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
    fileOutputStream.write(bufffer, 0, bufferSize);
}
fileInputStream.close();
fileOutputStream.close();
Shaktisinh Jadeja
fuente
1
respuesta limpia y simple: sin dependencias adicionales.
Clocker
¡Por favor, podría describir las primeras 2 líneas!
AVA
8

FileUtils de Apache commons será útil, si solo desea mover archivos desde el directorio de origen al de destino en lugar de copiar todo el directorio, puede hacer lo siguiente:

for (File srcFile: srcDir.listFiles()) {
    if (srcFile.isDirectory()) {
        FileUtils.copyDirectoryToDirectory(srcFile, dstDir);
    } else {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}

Si desea omitir directorios, puede hacer:

for (File srcFile: srcDir.listFiles()) {
    if (!srcFile.isDirectory()) {
        FileUtils.copyFileToDirectory(srcFile, dstDir);
    }
}
Usuario no encontrado
fuente
2
copyFileToDirectory no "mover" el archivo
Aleb
7

Parece que estás buscando la solución simple (algo bueno). Recomiendo usar FileUtils.copyDirectory de Apache Common :

Copia un directorio completo a una nueva ubicación conservando las fechas del archivo.

Este método copia el directorio especificado y todos sus directorios y archivos secundarios en el destino especificado. El destino es la nueva ubicación y el nombre del directorio.

El directorio de destino se crea si no existe. Si el directorio de destino existía, entonces este método fusiona la fuente con el destino, y la fuente tiene prioridad.

Su código podría ser agradable y simple como este:

File trgDir = new File("/tmp/myTarget/");
File srcDir = new File("/tmp/mySource/");

FileUtils.copyDirectory(srcDir, trgDir);
Stu Thompson
fuente
Hola, no quiero copiar el directorio, solo los archivos que contiene.
user42155
Es básicamente lo mismo, ¿no? Todos los archivos del directorio de origen terminarán en el directorio de destino.
Stu Thompson
1
Ese es un método mucho mejor que leer y luego escribir los archivos. +1
Optimus Prime
6

Inspirado por la respuesta de Mohit en este hilo . Aplicable solo para Java 8.

Lo siguiente se puede usar para copiar todo recursivamente de una carpeta a otra:

public static void main(String[] args) throws IOException {
    Path source = Paths.get("/path/to/source/dir");
    Path destination = Paths.get("/path/to/dest/dir");

    List<Path> sources = Files.walk(source).collect(toList());
    List<Path> destinations = sources.stream()
            .map(source::relativize)
            .map(destination::resolve)
            .collect(toList());

    for (int i = 0; i < sources.size(); i++) {
        Files.copy(sources.get(i), destinations.get(i));
    }
}

Estilo de transmisión FTW.

Upd 2019-06-10: nota importante: cierre la secuencia (por ejemplo, usando try-with-resource) adquirida por la llamada Files.walk. Gracias a @jannis por el punto.

xzt
fuente
¡¡Increíble!! use Stream paralelo si alguien quiere copiar el directorio que tiene millones de archivos. Puedo mostrar el progreso de copiar archivos fácilmente, pero en el comando JAVA 7 nio copyDirectory, para el directorio grande no pude mostrar el progreso a los usuarios.
Aqeel Haider
1
Sugiero cerrar el flujo devuelto Files.walk(source)como se recomienda en los documentos o podría tener problemas
Jannis
4

A continuación se muestra el código modificado de Brian que copia archivos de la ubicación de origen a la ubicación de destino.

public class CopyFiles {
 public static void copyFiles(File sourceLocation , File targetLocation)
    throws IOException {

        if (sourceLocation.isDirectory()) {
            if (!targetLocation.exists()) {
                targetLocation.mkdir();
            }
            File[] files = sourceLocation.listFiles();
            for(File file:files){
                InputStream in = new FileInputStream(file);
                OutputStream out = new FileOutputStream(targetLocation+"/"+file.getName());

                // Copy the bits from input stream to output stream
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                in.close();
                out.close();
            }            
        }
    }
thamizhannal
fuente
4

Java 8

Path sourcepath = Paths.get("C:\\data\\temp\\mydir");
        Path destinationepath = Paths.get("C:\\data\\temp\\destinationDir");        
        Files.walk(sourcepath)
             .forEach(source -> copy(source, destinationepath.resolve(sourcepath.relativize(source)))); 

Método de copia

static void copy(Path source, Path dest) {
        try {
            Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
Niraj Sonawane
fuente
3

Puede solucionar el problema con copiar el archivo fuente a un nuevo archivo y eliminar el original.

public class MoveFileExample {

 public static void main(String[] args) {   

    InputStream inStream = null;
    OutputStream outStream = null;

    try {

        File afile = new File("C:\\folderA\\Afile.txt");
        File bfile = new File("C:\\folderB\\Afile.txt");

        inStream = new FileInputStream(afile);
        outStream = new FileOutputStream(bfile);

        byte[] buffer = new byte[1024];

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

        inStream.close();
        outStream.close();

        //delete the original file
        afile.delete();

        System.out.println("File is copied successful!");

    } catch(IOException e) {
        e.printStackTrace();
    }
 }
}
Guy Ben-Shahar
fuente
2

Utilizar

org.apache.commons.io.FileUtils

Es muy útil

Bhimesh
fuente
44
Si va a publicar una respuesta que sugiera una biblioteca, sería bueno que realmente explicara cómo usarla en lugar de simplemente mencionar su nombre.
Aparece el
2
File dir = new File("D:\\mital\\filestore");
File[] files = dir.listFiles(new File_Filter("*"+ strLine + "*.txt"));
for (File file : files){    
    System.out.println(file.getName());

    try {
        String sourceFile=dir+"\\"+file.getName();
        String destinationFile="D:\\mital\\storefile\\"+file.getName();
        FileInputStream fileInputStream = new FileInputStream(sourceFile);
        FileOutputStream fileOutputStream = new FileOutputStream(
                        destinationFile);
        int bufferSize;
        byte[] bufffer = new byte[512];
        while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
            fileOutputStream.write(bufffer, 0, bufferSize);
        }
        fileInputStream.close();
        fileOutputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
mital
fuente
1

uso el siguiente código para transferir un CommonMultipartFilearchivo cargado a una carpeta y copiar ese archivo a una carpeta de destino en la carpeta de proyecto web webapps (es decir)

    String resourcepath = "C:/resources/images/" + commonsMultipartFile.getOriginalFilename();

    File file = new File(resourcepath);
    commonsMultipartFile.transferTo(file);

    //Copy File to a Destination folder
    File destinationDir = new File("C:/Tomcat/webapps/myProject/resources/images/");
    FileUtils.copyFileToDirectory(file, destinationDir);
lk.annamalai
fuente
1

Copie el archivo de un directorio a otro directorio ...

FileChannel source=new FileInputStream(new File("source file path")).getChannel();
FileChannel desti=new FileOutputStream(new File("destination file path")).getChannel();
desti.transferFrom(source, 0, source.size());
source.close();
desti.close();
Rajneesh Mishra
fuente
1

aquí es simplemente un código java para copiar datos de una carpeta a otra, solo tiene que dar la entrada del origen y el destino.

import java.io.*;

public class CopyData {
static String source;
static String des;

static void dr(File fl,boolean first) throws IOException
{
    if(fl.isDirectory())
    {
        createDir(fl.getPath(),first);
        File flist[]=fl.listFiles();
        for(int i=0;i<flist.length;i++)
        {

            if(flist[i].isDirectory())
            {
                dr(flist[i],false);
            }

            else
            {

                copyData(flist[i].getPath());
            }
        }
    }

    else
    {
        copyData(fl.getPath());
    }
}

private static void copyData(String name) throws IOException {

        int i;
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        System.out.println(str);
        FileInputStream fis=new FileInputStream(name);
        FileOutputStream fos=new FileOutputStream(str);
        byte[] buffer = new byte[1024];
        int noOfBytes = 0;
         while ((noOfBytes = fis.read(buffer)) != -1) {
             fos.write(buffer, 0, noOfBytes);
         }


}

private static void createDir(String name, boolean first) {

    int i;

    if(first==true)
    {
        for(i=name.length()-1;i>0;i--)
        {
            if(name.charAt(i)==92)
            {
                break;
            }
        }

        for(;i<name.length();i++)
        {
            des=des+name.charAt(i);
        }
    }
    else
    {
        String str=des;
        for(i=source.length();i<name.length();i++)
        {
            str=str+name.charAt(i);
        }
        (new File(str)).mkdirs();
    }

}

public static void main(String args[]) throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("program to copy data from source to destination \n");
    System.out.print("enter source path : ");
    source=br.readLine();
    System.out.print("enter destination path : ");
    des=br.readLine();
    long startTime = System.currentTimeMillis();
    dr(new File(source),true);
    long endTime   = System.currentTimeMillis();
    long time=endTime-startTime;
    System.out.println("\n\n Time taken = "+time+" mili sec");
}

}

este es un código de trabajo para lo que quieres ... avísame si ayudó

Nikunj Gupta
fuente
Olvidó cerrar FileInputStream y FileOutputStream en copyData.
everblack
0

Puede usar el siguiente código para copiar archivos de un directorio a otro

// parent folders of dest must exist before calling this function
public static void copyTo( File src, File dest ) throws IOException {
     // recursively copy all the files of src folder if src is a directory
     if( src.isDirectory() ) {
         // creating parent folders where source files is to be copied
         dest.mkdirs();
         for( File sourceChild : src.listFiles() ) {
             File destChild = new File( dest, sourceChild.getName() );
             copyTo( sourceChild, destChild );
         }
     } 
     // copy the source file
     else {
         InputStream in = new FileInputStream( src );
         OutputStream out = new FileOutputStream( dest );
         writeThrough( in, out );
         in.close();
         out.close();
     }
 }
Varun Bhatia
fuente
0
    File file = fileChooser.getSelectedFile();
    String selected = fc.getSelectedFile().getAbsolutePath();
     File srcDir = new File(selected);
     FileInputStream fii;
     FileOutputStream fio;
    try {
         fii = new FileInputStream(srcDir);
         fio = new FileOutputStream("C:\\LOvE.txt");
         byte [] b=new byte[1024];
         int i=0;
        try {
            while ((fii.read(b)) > 0)
            {

              System.out.println(b);
              fio.write(b);
            }
            fii.close();
            fio.close();
Nithin
fuente
¿Qué es fileChooser?
Dinoop paloli
0

siguiente código para copiar archivos de un directorio a otro

File destFile = new File(targetDir.getAbsolutePath() + File.separator
    + file.getName());
try {
  showMessage("Copying " + file.getName());
  in = new BufferedInputStream(new FileInputStream(file));
  out = new BufferedOutputStream(new FileOutputStream(destFile));
  int n;
  while ((n = in.read()) != -1) {
    out.write(n);
  }
  showMessage("Copied " + file.getName());
} catch (Exception e) {
  showMessage("Cannot copy file " + file.getAbsolutePath());
} finally {
  if (in != null)
    try {
      in.close();
    } catch (Exception e) {
    }
  if (out != null)
    try {
      out.close();
    } catch (Exception e) {
    }
}
Dhrumil Shah
fuente
0
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFiles {
    private File targetFolder;
    private int noOfFiles;
    public void copyDirectory(File sourceLocation, String destLocation)
            throws IOException {
        targetFolder = new File(destLocation);
        if (sourceLocation.isDirectory()) {
            if (!targetFolder.exists()) {
                targetFolder.mkdir();
            }

            String[] children = sourceLocation.list();
            for (int i = 0; i < children.length; i++) {
                copyDirectory(new File(sourceLocation, children[i]),
                        destLocation);

            }
        } else {

            InputStream in = new FileInputStream(sourceLocation);
            OutputStream out = new FileOutputStream(targetFolder + "\\"+ sourceLocation.getName(), true);
            System.out.println("Destination Path ::"+targetFolder + "\\"+ sourceLocation.getName());            
            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
            noOfFiles++;
        }
    }

    public static void main(String[] args) throws IOException {

        File srcFolder = new File("C:\\sourceLocation\\");
        String destFolder = new String("C:\\targetLocation\\");
        CopyFiles cf = new CopyFiles();
        cf.copyDirectory(srcFolder, destFolder);
        System.out.println("No Of Files got Retrieved from Source ::"+cf.noOfFiles);
        System.out.println("Successfully Retrieved");
    }
}
Harinath Reddy
fuente
0

Ni siquiera eso es complicado y no se requieren importaciones en Java 7:

El renameTo( )método cambia el nombre de un archivo:

public boolean renameTo( File destination)

Por ejemplo, para cambiar el nombre del archivo src.txten el directorio de trabajo actual a dst.txt, escribiría:

File src = new File(" src.txt"); File dst = new File(" dst.txt"); src.renameTo( dst); 

Eso es.

Referencia:

Harold, Elliotte Rusty (2006-05-16). E / S Java (p. 393). O'Reilly Media. Versión Kindle.

Señor anderson
fuente
2
Moverse no es copiar.
Nathan Tuggy
Esto moverá el archivo. Respuesta incorrecta !
smilyface
Como se especifica en los comentarios sobre la pregunta, la mudanza funcionará para OP.
Mohit Kanwar
Votado, porque se ajusta a mi propio problema Y es la respuesta más fácil que existe para mover archivos. Gracias amigo
LevKaz
Por favor, conteste la respuesta a la pregunta
Shaktisinh Jadeja
0

Puede usar el siguiente código para copiar archivos de un directorio a otro

public static void copyFile(File sourceFile, File destFile) throws IOException {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(sourceFile);
            out = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
        finally {
            in.close();
            out.close();
        }
    }
Tanmay kumar shaw
fuente
0

Siguiendo la función recursiva que he escrito, si ayuda a alguien. Copiará todos los archivos dentro de sourcedirectory a destinationDirectory.

ejemplo:

rfunction("D:/MyDirectory", "D:/MyDirectoryNew", "D:/MyDirectory");

public static void rfunction(String sourcePath, String destinationPath, String currentPath) {
    File file = new File(currentPath);
    FileInputStream fi = null;
    FileOutputStream fo = null;

    if (file.isDirectory()) {
        String[] fileFolderNamesArray = file.list();
        File folderDes = new File(destinationPath);
        if (!folderDes.exists()) {
            folderDes.mkdirs();
        }

        for (String fileFolderName : fileFolderNamesArray) {
            rfunction(sourcePath, destinationPath + "/" + fileFolderName, currentPath + "/" + fileFolderName);
        }
    } else {
        try {
            File destinationFile = new File(destinationPath);

            fi = new FileInputStream(file);
            fo = new FileOutputStream(destinationPath);
            byte[] buffer = new byte[1024];
            int ind = 0;
            while ((ind = fi.read(buffer))>0) {
                fo.write(buffer, 0, ind);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            if (null != fi) {
                try {
                    fi.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (null != fo) {
                try {
                    fo.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}
Yogesh Sanchihar
fuente
0

Si no desea usar bibliotecas externas y quiere usar las clases java.io en lugar de java.nio, puede usar este método conciso para copiar una carpeta y todo su contenido:

/**
 * Copies a folder and all its content to another folder. Do not include file separator at the end path of the folder destination.
 * @param folderToCopy The folder and it's content that will be copied
 * @param folderDestination The folder destination
 */
public static void copyFolder(File folderToCopy, File folderDestination) {
    if(!folderDestination.isDirectory() || !folderToCopy.isDirectory())
        throw new IllegalArgumentException("The folderToCopy and folderDestination must be directories");

    folderDestination.mkdirs();

    for(File fileToCopy : folderToCopy.listFiles()) {
        File copiedFile = new File(folderDestination + File.separator + fileToCopy.getName());

        try (FileInputStream fis = new FileInputStream(fileToCopy);
             FileOutputStream fos = new FileOutputStream(copiedFile)) {

            int read;
            byte[] buffer = new byte[512];

            while ((read = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, read);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
Domenico
fuente
0

La mejor manera según mi conocimiento es la siguiente:

    public static void main(String[] args) {

    String sourceFolder = "E:\\Source";
    String targetFolder = "E:\\Target";
    File sFile = new File(sourceFolder);
    File[] sourceFiles = sFile.listFiles();
    for (File fSource : sourceFiles) {
        File fTarget = new File(new File(targetFolder), fSource.getName());
        copyFileUsingStream(fSource, fTarget);
        deleteFiles(fSource);
    }
}

    private static void deleteFiles(File fSource) {
        if(fSource.exists()) {
            try {
                FileUtils.forceDelete(fSource);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void copyFileUsingStream(File source, File dest) {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(source);
            os = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } catch (Exception ex) {
            System.out.println("Unable to copy file:" + ex.getMessage());
        } finally {
            try {
                is.close();
                os.close();
            } catch (Exception ex) {
            }
        }
    }
Pankaj
fuente