Copiare file e cartelle in Java

Creato il 04 giugno 2012 da Ketek @CarloVentrella

Con questo codice vi spiego come poter copiare file o intere cartelle in Java dal momento che non esiste, che io sappia, una classe che lo faccia appositamente.

Essenziali per la riuscita del nostro codice sono FileInputStream e FileOutputStream, stream che ci permettono proprio di leggere il file dalla posizione originale e copiarlo in quella di destinazione.

Il codice è così organizzato: il costruttore gestisce i dati inseriti, quindi il file/cartella di origine e la destinazione attraverso controlli appositi che li reindirizzeranno verso le apposite funzioni.

La funzione leggo_i_file elabora tutti i file che saranno copiati: è utile specificare che all´interno della cartella possono essere presenti file ma anche altre cartelle che a loro volta possono contenere dei file che devono essere inviati insieme al resto.

Infine la copioFile(origine,destinazione), quella che ci interessa in particolar modo, è quella che gestisce la copia dei file. Passiamo subito al codice:

JAVA

 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class copy {
 
                FileInputStream fis = null;
                FileOutputStream fos = null;
 
                public copy(String origine, String destinaz) throws IOException
                {
                               File orig = new File(origine);
                               File dest = new File(destinaz);
 
                               //controllo che dest sia una cartella altrimenti chiudo
 
                               if (dest.isFile())
                               {
                                               System.out.println("**La destinazione deve essere una cartella");
                                               System.exit(0);
                               }
 
                               if (orig.isFile())
                               {
                                               copioFile(orig,new File(dest+"\\"+orig.getName()));
                               }
                               else
                               {
 
                               String dir_path = dest + "\\";
 
                               // copio i file
 
                               leggo_i_file(orig,dest,dir_path);
 
                               }
                }
 
                File dir = null; // mi serve nel caso in cui ci sono cartelle in altre cartelle
 
                public void leggo_i_file(File orig,File dest,String dir_path) throws IOException
                {
                               // creo la cartella
                               dir_path +=  orig.getName()+"\\";
                               dir = new File(dir_path);
 
                               if (!dir.exists())
                               {
                                               System.out.println("La cartella non esiste, ne creo una nuova: "+dir);
                                               dir.mkdirs();
                               }
 
                               File [] lista = orig.listFiles();
                               for(int y = 0; y < lista.length; y++)
                               {
                                               if (lista[y].isFile())
                                               {
                                                               //invia File
                                                               System.out.println(lista[y]+": File, "+y);
                                                               copioFile( lista[y] ,new File(dir+"\\"+lista[y].getName()));
                                               }
                                               else if (lista[y].isDirectory())
                                               {
                                                               //ricorsione
                                                               leggo_i_file(lista[y],dest,dir_path);
                                               }
                               }
                }
 
                public void copioFile(File orig, File dest) throws IOException
                {
                               int letti = 0;
                               long tot = 0;
                             // inizializzo uno buffer di 4Kb
                               byte[] buffer = new byte[4096];
                               // inizializzo stream per la copia del file
                               try {
                                               fis = new FileInputStream(orig);
                                               fos = new FileOutputStream(dest);
                               } catch (FileNotFoundException e) {
                                               System.out.println("**C´è stato qualche problema con gli stream");
                                               System.exit(0);
                               }
                               System.out.println(orig+" , "+orig.length()+" byte ");
 
            while((letti = fis.read(buffer)) != -1){
                fos.write(buffer, 0, letti);
                tot += letti;
            }
        System.out.println("**File copiato. "+tot+"/"+orig.length()+" byte");
        // chiudo il file d´origine
        fis.close();
        //chiudo il file di destinazione
        fos.close();
 
                }
 
                public static void main(String args[]) throws IOException
                {
                               new copy("C:\\Users\\Prova\\Documents\\Battlefield 3","C:\\Users\\Prova\\Desktop");
                }
}