Localizar diretorio e copiar arquivo para o mesmo em um foearch

5 respostas
M

olá, boa noite !! preciso fazer com que eu busque em todos os diretórios da unidade corrente, sendo C:, F:, G: etc um determinado arquivo com o nome de por ex: ATUALIZA.EXE
bom, o que fiz foi varrer o hd e localizar o arquivo ATUALIZA.EXE , adicionar em uma lista o nome dos diretorios onde foram encontrados estes arquivos. bom, consigo ler o
retorno da lista normalmente me indicando que foi encontrado o ATUALIZA.EXE em tantos diretorios. agora o que preciso fazer é substituir este arquivo ATUALIZA.EXE por um
outro arquivo ATUALIZA.EXE , e onde estou apanhando é nesta parte do codigo:

for (String local : search.getResultado()) {

				destFolder = new File(local.toLowerCase());

				System.out.println("encontrado no dir: "
						+ destFolder.getParent());

			}

aqui ele me mostra o que eu quero, procurando o arquivo customermanagerforweb.war :

o problema é que ele esta localizando este arquivo, adicionando na lista dentro do forearch, e eu não consigo já copiar o novo arquivo para o diretorio encontrado.
ja que dentro do foreach ele ainda esta adicionando a lista, e nao consigo pegar o resulado por fora do laço.
não sei se da forma que fiz para localizar foi o melhor jeito, pode estar errado, se alguem tiver uma outra idéia e quizer compartilhar, agradeco !

segue o codigo completo:

a classe que faz a procura :

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.io.FileUtils;

public class SearchFiles {

	private static String directory = null;
	private static String fileName = null;
	private static String searchName;

	public void searchRoot(File directory, String fileName) {

		setSearchName(fileName);

		if (directory.isDirectory()) {
			searchInDirectory(directory);

		} else {

			System.out.println(directory.getAbsoluteFile()
					+ " Não é um diretório");
		}
	}

	@SuppressWarnings("unused")
	private void searchInDirectory(File file) {

		String fileSeparator = "\\";

		System.out.println("procurando no diretorio " + file.getAbsoluteFile());

		if (file.isDirectory()) {

			if (file.canRead()) {

				for (File temp : file.listFiles()) {

					if (temp.isDirectory()) {

						searchInDirectory(temp);

					} else {

						if (getSearchName()
								.equals(temp.getName().toLowerCase())) {

							try {

								resultado.add(temp.getCanonicalPath()
										.toString());

							} catch (IOException e) {
								e.printStackTrace();
							}
						}
					}
				}
			} else {
				System.out
						.println(file.getAbsoluteFile() + " Permissão negada");
			}
		}
	}

	@SuppressWarnings({ "static-access", "unused" })
	public void runSearchFile(String directory, String fileName)
			throws IOException {

	
		SearchFiles search = new SearchFiles();

		search.searchRoot(new File(directory), fileName.toLowerCase());

		int count = search.getResultado().size();

		if (count == 0) {

			System.out.println("\nNão foi encontrado o arquivo "
					+ search.getFileName());

		} else {

			System.out.println("\n");

			for (String local : search.getResultado()) {

				destFolder = new File(local.toLowerCase());

				System.out.println("encontrado no dir: "
						+ destFolder.getParent());

			}

			System.out.println("\ntotal de : " + count + " diretorios");
		}

	}

	public static void copyFolder(File src, File dest) throws IOException {

		if (src.isDirectory()) {

			if (!dest.exists()) {
				dest.mkdir();
				System.out.println("Diretorio copiado de " + src + "  para "
						+ dest);
			}

			String files[] = src.list();

			for (String file : files) {
				File srcFile = new File(src, file);
				File destFile = new File(dest, file);
				copyFolder(srcFile, destFile);
			}

		} else {

			InputStream in = new FileInputStream(src);
			OutputStream out = new FileOutputStream(dest);

			byte[] buffer = new byte[1024];

			int length;
			while ((length = in.read(buffer)) > 0) {
				out.write(buffer, 0, length);
			}

			in.close();
			out.close();
			System.out.println("Arquivo copiado de " + src + " para " + dest);
		}
	}

	public void getAllFileBasedOnExtensions() throws IOException {

		File dir = new File("D:\\");
		String[] extensions = new String[] { "rar" };

		List<File> files = (List<File>) FileUtils.listFiles(dir, extensions,
				true);

		int count = files.size();

		if (count == 0) {

			System.out.println("\nNão foi encontrado o arquivo ");

		} else

			for (File file : files) {
				System.out.println("arquivo : " + file.getCanonicalPath());

			}

		System.out.println("\ntotal de arquivos .rar encontrados : " + count);

	}

	public static String getDirectory() {
		return directory;
	}

	public static void setDirectory(String directory) {
		SearchFiles.directory = directory;
	}

	public static String getFileName() {
		return fileName;
	}

	public static void setFileName(String fileName) {
		SearchFiles.fileName = fileName;
	}

	private LinkedList<String> resultado = new LinkedList<String>();

	public String getSearchName() {
		return searchName;
	}

	public void setSearchName(String searchName) {
		this.searchName = searchName;
	}

	public LinkedList<String> getResultado() {
		return resultado;
	}

	public void setResultado(LinkedList<String> resultado) {
		this.resultado = resultado;
	}
}

e o main :

import java.io.IOException;

import br.com.trocaversao.controller.SearchFiles;

public class Main {

	@SuppressWarnings("static-access")
	public static void main(String[] args) throws IOException {

		SearchFiles search = new SearchFiles();

		search.setDirectory("D:\\Aulas Java");
		search.setFileName("CustomerManagerForWeb.war");

		new SearchFiles().runSearchFile(search.getDirectory(), search.getFileName());

	//	search.getAllFileBasedOnExtensions();

	}

}

5 Respostas

dobau

E porque você não faz a cópia dos arquivos somente depois de terminar a busca, afinal seu método se chama runSearchFile ?

M

o problema esta justamente em pegar o resultado apos o término da busca fora do laço do forearch !

dobau

O runSearchFile pode retornar uma lista de String que seriam os caminhos encontrados, não ?

JuniorMaia

cria um array chamado diretorios[] e nele você guarda os encontrados, depois faz o que quiser com as posições existentes, que seriam os diretórios encontrados guardados nas suas devidas posições.

M

Obrigado JuniorMaia e dobau.
fiz o que você sugeriu e deu certo. criei outra lista na mesma classe e dentro do for copiei tudo para esta outra lista,
desta forma consegui pegar o resultado que precisava. mais uma vez obrigado a todos.

private List<String> return = new List<String>();  

for (String local : search.getResultado()) {  
  
                destFolder = new File(local.toLowerCase());  
  
                System.out.println("encontrado no dir: "  + destFolder.getParent());  


               return.add(destFolder.getParent().toString());

  
            }
Criado 19 de janeiro de 2013
Ultima resposta 21 de jan. de 2013
Respostas 5
Participantes 3