Swing- copiar pasta de um local e salvar em outra

7 respostas
S

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

7 Respostas

diego_qmota

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…

Anime

Oi,

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

S

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

Anime

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

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

S

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)

diego_qmota

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]

Criado 7 de dezembro de 2010
Ultima resposta 8 de dez. de 2010
Respostas 7
Participantes 3