Copiar todos os arquivos de uma determinada extensão de uma pasta para outra

4 respostas
J

boa noite sou iniciante em java estou com essa duvida .

Como faria para copiar todos os arquivos de uma pasta pela extensão ?

Pesquisei no forum e achei o exemplo do vini que e muito bom e funcionou legal mas apenas para a copia de um arquivo.

public static void copiar_arquivos(File origen, File destino) throws IOException {  
     if (destino.exists())  
         destino.delete();  
  
     FileChannel sourceChannel = null;  
     FileChannel destinationChannel = null;  
  
     try {  
         sourceChannel = new FileInputStream(origen).getChannel();  
         destinationChannel = new FileOutputStream(destino).getChannel();  
         sourceChannel.transferTo(0, sourceChannel.size(),  
                 destinationChannel);  
     } finally {  
         if (sourceChannel != null && sourceChannel.isOpen())  
             sourceChannel.close();  
         if (destinationChannel != null && destinationChannel.isOpen())  
             destinationChannel.close();  
    }  
}

mas como faria para copiar todos os arquivos .bat que estão dentro de uma determinada pasta por exemplo ?

hoje estou usando um scrip.bat para isso que esta assim

copy O:*.BAK R:\

mas como faria isso usando este exemplo do vini ou outro ?

valeu desde ja agradeço.

4 Respostas

D

Olá,

Fiz um exemplo aqui rapido, vê se te ajuda, qualquer coisa é só falar :)

Abraços,
Daniel

package com.io.sample2;

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

/**
 * Como faria para copiar todos os arquivos de uma pasta pela extensão ? 
 */

public final class FileCopy {
	
	private File fromDirectory;
	private File toDirectory;
	private String fileExtension;
	
	public static void main(String[] args) {
		FileCopy main = new FileCopy();
		main.enterInfo();
		main.checkDirAndExtension(main.fromDirectory, main.toDirectory, main.fileExtension);
	}
	
	private void enterInfo(){
		Scanner in = new Scanner(System.in);
		System.out.println("Entre com o nome do diretorio de origem : [ex : /Users/Desktop]"); 
		fromDirectory = new File(in.nextLine());
		
		System.out.println("Entre com o nome do diretorio de destino : [ex : /Users/Desktop/test]");  
		toDirectory = new File(in.nextLine());
		
		System.out.println("Enter with file extension : [ex: .pdf]");  
		fileExtension = in.nextLine();
	}
	
	
	private void checkDirAndExtension(File fromDirectory , File toDirectory, String extension){

		if(fromDirectory.isDirectory() && toDirectory.isDirectory()){
			for (File file : fromDirectory.listFiles()){
				if(file.getName().endsWith(extension)){
					passFileToCopy(file, toDirectory);
				}
			}
		}
	}
	
	private void passFileToCopy(File fileTocopy, File toDirectory){
		try {
			//create a mirror file at the destination folder
			File mirrorFile = new File(toDirectory.getPath() + "/" + fileTocopy.getName());
			
			//open channels
			FileChannel sourceChannel = new FileInputStream(fileTocopy).getChannel();
			FileChannel destinationChannel = new FileOutputStream(mirrorFile).getChannel();

			//transfer bytes
			long size = sourceChannel.size();
			sourceChannel.transferTo(0, size, destinationChannel);

			System.out.println("File : " + fileTocopy.getName() + " copiado para o diretorio : " + toDirectory);	
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}    
	}
}
J

valeu daniel o metodo funcionou .
mas so mais uma duvida em alguns arquivos da um exeception

java.io.IOException: Map failed
	at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:748)
	at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:437)
	at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:510)
	at total.backup.FileCopy.passFileToCopy(FileCopy.java:66)
	at total.backup.FileCopy.checkDirAndExtension(FileCopy.java:47)
	at total.backup.FileCopy.main(FileCopy.java:26)
Caused by: java.lang.OutOfMemoryError: Map failed
	at sun.nio.ch.FileChannelImpl.map0(Native Method)
	at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:745)
	... 5 more

pesquisei sobre a classe map mas não encontrei um maneira de resolver isso
o windows copia normal os arquivos.
mais valeu pela resposta rapida.

M

O problema acontece porque os arquivos não estão sendo fechados e os buffers estão ficando na memória, uma forma mais simples de se implementar isso seria assim:

[code=java]package me.techbot.java;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.Closeable;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.FilenameFilter;

import java.io.InputStream;

import java.io.OutputStream;

public class FileCopy {

public static void main(String[] args) {
	
	File source = new File("source");
	File destination = new File("destination" );
	
	copyFiles( source, destination, "txt" );
	
}

public static void copyFiles( File source, File destination, final String ending ) {
	
	FilenameFilter filter = new FilenameFilter() {
		
		@Override
		public boolean accept(File dir, String name) {
			return  name.endsWith(ending) ;
		}
		
	};
	
	File[] files = source.listFiles(filter);
	
	for ( File file : files ) {

		InputStream input = null;
		OutputStream output = null;
		
		
		try {
			input = new BufferedInputStream( new FileInputStream(file) );
			output = new BufferedOutputStream( new FileOutputStream(new File( destination, file.getName() )) );
			
			int result = -1;
			
			while ( ( result = input.read() ) != -1 ) {
				output.write( result );
			}
			
			output.flush();
			
		} catch ( Exception e ) {
			throw new RuntimeException(e);
		} finally {
		    close( input, output );
		}
		
	}
	
}

public static void close( Closeable ... items ) {
	
	for ( Closeable c : items ) {
		if ( c != null ) {
			try {
				c.close();
			} catch ( Exception e) {
				throw new RuntimeException(e);
			}
		}
	}
	
}

}
J

desculpa a demora mais valeu mauricio linhares o metodo funcionou velu mesmo

Criado 4 de junho de 2011
Ultima resposta 29 de jun. de 2011
Respostas 4
Participantes 3