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]