Swing- copiar pasta de um local e salvar em outra

Pessoal da para fazer em Swing um programa que copie uma pasta de um diretorio e cole em outra?

Com certeza. Vou apresentar um resumo.

Para isso, você terá que:

[list]Montar a interface gráfica no Swing;[/list]
[list]Inserir um JButton - ou algum controle - que dispare o evento que iniciará a execução da operação;[/list]


public class Janela extends JFrame {
 
    public Janela() {
        super("CopiaDiretorio");
        JButton botao = new JButton("Efetuar cópia");
        botao.addActionListener( new ActionListener(){  
     public void actionPerformed(ActionEvent e){  
           CopiaDiretorio copia = new CopiaDiretorio();
           copia.copiar (pastaOrigem, pastaDestino);
     }  
 });        
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
 

}

A operação poderá ser encapsulada em uma classe - que sua interface gráfica instanciará como um objeto e chamará o método que inicia esse processamento.

A classe que encapsula a operação deverá (exemplo de nome para a classe: CopiaDiretorio):

[list]Ter um método que inicia a operação de cópia;[/list]
[list]Crie um loop for que utiliza a classe java.io.File para percorrer os arquivos (e subdiretórios) dentro do diretório origem (utilize no for o método listFiles() );[/list]
[list]Se você localizar algum subdiretório dentro do loop (método isDirectory() ), chame o método de cópia recursivamente passando o subdiretório como parâmetro;[/list]
[list]Para cada arquivo localizado, você terá que utilizar um FileInputStream e um FileOutputStream para ler o arquivo e depois escrever ele no novo diretório.[/list]


public class CopiaDiretorio
{

public void copiar(java.io.File pastaOrigem, java.io.File pastaDestino) 
{
      //...
     for (java.io.File pasta : pastaDestino.listFiles()) {

          if (pasta.isDirectory()) {
               copiar(pasta, pastaDestino);   //Chamada recursiva para cópia dos arquivos do subdiretório
          } else {
          
               //Aqui você insere a lógica para ler os arquivos e gravá-los na pasta de destino (streams)
               //Lembre-se que, se necessário, você terá que criar sub-diretórios na pasta destino

          }

     }
}

}

Resumidamente é isso. Há outras maneiras de fazer isso, como substituir o uso de streams por classes que possuam métodos que já realizam essa cópia… eu lembro que existem, dá uma procurada se preferir evitar streams…

Oi,

Nessa apostila você encontrará isso:http://acervobrasil.blogspot.com/2008/10/apostila-java-2-com-banco-de-dados.html

Você tem algum exemplo para que eu possa me basear?

Desculpe,quem é você nesse caso,eu ou o diego_qmota…

Segue a classe que faz a cópia dos arquivos de um diretório para outro.
Localizei ela no meio dos montes de bibliotecas que tenho … ehehe


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class CopiaArquivos {


    /**
     * Copia arquivos de um local para o outro.
     * @param origem - Arquivo de origem
     * @param destino - Arquivo de destino
     * @param overwrite - Confirmação para sobrescrever os arquivos
     * @throws IOException
     */
    public static void copy(File origem, File destino, boolean overwrite) throws IOException {

        if (destino.exists() && !overwrite) {
            return;
        }

        FileInputStream source = new FileInputStream(origem);
        FileOutputStream destination = new FileOutputStream(destino);

        FileChannel sourceFileChannel = source.getChannel();
        FileChannel destinationFileChannel = destination.getChannel();

        long size = sourceFileChannel.size();
        sourceFileChannel.transferTo(0, size, destinationFileChannel);

    }

    /**
     * Copia todos os arquivos que tenham uma determinada extensão de uma pasta de origem para outra de destino.
     * @param origem - Diretório onde estão os arquivos a serem copiados
     * @param destino - Diretório onde os arquivos serão copiados
     * @param extensao - <i>String</i> Extensão do arquivo que deve ser copiada. Você pode inserir a extensão no formato: ".doc" ou "doc" (por exemplo)
     * @param overwrite - Confirmação para sobrescrever os arquivos
     * @throws IOException, UnsupportedOperationException
     */
    public static void copyAll(File origem, File destino, String extensao, boolean overwrite) throws IOException, UnsupportedOperationException {
        if (!destino.exists()) {
            destino.mkdir();
        }
        if (!origem.isDirectory()) {
            throw new UnsupportedOperationException("Origem deve ser um diretório");
        }
        if (!destino.isDirectory()) {
            throw new UnsupportedOperationException("Destino deve ser um diretório");
        }
        File[] files = origem.listFiles();
        for (int i = 0; i < files.length; ++i) {
            if (files[i].isDirectory()) {
                copyAll(files[i], new File(destino + "\\" + files[i].getName()), overwrite);
            } else {
                if (files[i].getName().endsWith(extensao)) {
                    copy(files[i], new File(destino + "\\" + files[i].getName()), overwrite);
                }
            }
        }
    }

    /**
     * Copia todos os arquivos de dentro de uma pasta para outra.
     * @param origem - Diretório onde estão os arquivos a serem copiados
     * @param destino - Diretório onde os arquivos serão copiados
     * @param overwrite - Confirmação para sobrescrever os arquivos
     * @throws IOException, UnsupportedOperationException
     */
    public static void copyAll(File origem, File destino, boolean overwrite) throws IOException, UnsupportedOperationException {
        if (!destino.exists()) {
            destino.mkdir();
        }
        if (!origem.isDirectory()) {
            throw new UnsupportedOperationException("Origem deve ser um diretório");
        }
        if (!destino.isDirectory()) {
            throw new UnsupportedOperationException("Destino deve ser um diretório");
        }
        File[] files = origem.listFiles();
        for (int i = 0; i < files.length; ++i) {
            if (files[i].isDirectory()) {
                copyAll(files[i], new File(destino + "\\" + files[i].getName()), overwrite);
            } else {
                System.out.println("Copiando arquivo: " + files[i].getName());
                copy(files[i], new File(destino + "\\" + files[i].getName()), overwrite);
            }
        }
    }


    /**
     * Copia arquivos de um local para o outro
     * *** Versão antiga - substitui esse método pelo uso da classe FileChannel - não sei ainda se é mais eficiente ***
     */
/*
    public static void copy_versaoantiga(File origem, File destino, boolean overwrite) throws IOException {

        if (destino.exists() && !overwrite) {
            return;
        }

        final int BUFFER_SIZE = 1 * 1024 * 1024;

        BufferedReader in = null;
        BufferedWriter out = null;

        try {

        in = new BufferedReader(new FileReader(origem), BUFFER_SIZE);
        out = new BufferedWriter(new FileWriter(destino), BUFFER_SIZE);

        String line;
        while ((line = in.readLine()) != null) {
        out.write(line);
        }

        } finally {
        if (in != null) {
        in.close();
        }
        if (out != null) {
        out.close();
        }
        }

    }
*/

}

No Swing, é daquela forma mesmo que te enviei.
Você vai criar o JFrame, adicionar algum controle que quando sofra um evento, execute a operação (por exemplo, instancie um JButton, adicionando um ouvinte de eventos que quando o botão for pressionado chame o método, adicione o botão ao JFrame )
Daí você roda um desses métodos static da classe acima.
Eu não tenho no momento um exemplo pronto, mas o código abaixo vai exemplificar os passos:


import javax.swing.*;


public class JFrameCopiarDiretorio extends javax.swing.JFrame {

   //declare os controles e atributos aqui (JButton's, JTextField's, JLabel's, etc...) - ex: private JButton botaoExecutar;

    /**
    * Construtor.
    */
    public JFrameCopiarDiretorio() {
        // instancie os controles do formulário aqui (ex: this.botaoExecutar = new JButton("Executar operação");)
        // adicione tratamento para os eventos, inserindo uma chamada ao método que executará a operação de cópia (ex: botaoExecutar.addActionListener ( ... coloque no método actionPerformed uma chamada ao método efetuarCopia() ... ) )
        // adicionando os controles do formulário ao container 
        // dimensione a janela e a exiba, definindo a ação padrão caso a janela seja fechada
    }

    //Método que será chamado quando disparar o evento do JButton
    public void efetuarCopia() {
         try {

            java.io.File dirOrigem = new java.io.File("C:\Pasta_Origem");
            java.io.File dirdestino = new java.io.File("C:\Pasta_Destino");
            
            CopiaArquivos.copyAll(dirOrigem, dirdestino, true);
            
            JOptionPane.showMessageDialog(rootPane, "Cópia realiada com sucesso!");

        } catch (Exception e) {
            e.printStackTrace();   //insira o tratamento de erros que preferir
        }

    }

}

DICA: Use a IDE Netbeans para gerar a interface gráfica - que é mais simples para criá-la - e aumenta consideravelmente a produtividade! Para um projeto lcoalizado como o que você está querendo, você não terá perda de tempo montando a interface gráfica programaticamente…

Com o Netbeans, depois de um pouco de uso, você vê que é fácil para montar programas com interface mais simples. Você adiciona o tratamento de eventos mais facilmente também.
O código fico bem maior, mas pelo ganho de tempo no desenvolvimento acredito que compensa

/*
 * Código do JFRAME do programa criado com o netbeans
 */

/*
 * JFrameCopiarDiretorio.java
 *
 * Created on 08/12/2010, 10:54:22
 */
package apagaraposterminar;

import javax.swing.JOptionPane;

/**
 *
 * @author diego.queres
 */
public class JFrameCopiarDiretorio extends javax.swing.JFrame {

    /** Creates new form JFrameCopiarDiretorio */
    public JFrameCopiarDiretorio() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("Copiar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("Pasta origem");

        jLabel2.setText("Pasta destino");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(30, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButton1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 71, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jTextField1, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jTextField2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 285, Short.MAX_VALUE))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(32, 32, 32)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2))
                .addGap(28, 28, 28)
                .addComponent(jButton1)
                .addContainerGap(21, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        efetuarCopia();
    }

    public void efetuarCopia() {
        try {

            java.io.File dirOrigem = new java.io.File(jTextField1.getText());
            java.io.File dirdestino = new java.io.File(jTextField2.getText());

            CopiaArquivos.copyAll(dirOrigem, dirdestino, true);

            JOptionPane.showMessageDialog(rootPane, "Cópia realiada com sucesso!");

        } catch (Exception e) {
            e.printStackTrace();   //insira o tratamento de erros que preferir  
        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new JFrameCopiarDiretorio().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    // End of variables declaration
}

Programas com interfaces mais detalhadas exigirão que você conheça SWING, porquê o editor visual não vai te ajudar em tudo…

Provavelmente você terá que usar JFileChooser para escolher a pasta origem-destino. Daí te recomendo pesquisar sobre o assunto

Não estou conseguindo acessar a pasta.

FileInputStream source = new FileInputStream(“C:\Users\ejhosou\Documents\Scripts”);

java.io.FileNotFoundException: C:\Users\ejhosou\Documents\Scripts (Access is denied)
at java.io.FileInputStream.open(Native Method)

Nesse caso terão que ser liberadas permissões de acesso a essa pasta.
Você deverá tentar algumas das alternativas:

[list]Acessando a pasta em questão ecolocando ela em um local compartilhado (pasta de rede ou pasta dentro de “C:\Users\Public”) [/list]
[list]Entrar nas permissões do diretório e liberar as permissões necessárias de leitura/escrita[/list]
[list]Ou rodar o programa como adminstrador: http://www.google.com.br/search?q=rodar+java+como+administrador&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pt-BR:official&client=firefox-a[/list]