• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

cristpate

Script em Java

15 mensagens neste tópico

ola,

eu gostava de saber como fazer para mover ficheiros de uma pasta para outra em java (um script)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Possivelmente sera: copiar da pasta A para a pasta B e arranjar uma forma de apagar o ficheiro da pasta A.

Mas ja tens alguma coisa feita?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm  :hmm:

Concordo com o M.offspring.R, copiar todo o conteudo para a outra pasta de destino, ou seja, criando um novo ficheiro com esse conteudo.

Tentarei fazer um codigo de exemplo para ajudar ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem....Tal como disse, tentei fazer um código simples para ajudar mas parece que afinal não é tão simples quanto isso xD

Aqui está o que tentei fazer:

import java.io.*;


public class Mover {

private static String leString () {

	boolean fim = false;
	int ch; 	
	String r = "";
	while (!fim){

			try {
		ch = System.in.read();
		if (ch < 0 || (char)ch=='\n')
		fim = true;
		else
		r = r + (char) ch;
		}

			catch (java.io.IOException e){
		fim = true;
		}
		}
		return r;

	}


public static void main(String[] args) {

	BufferedReader leitor;
	BufferedWriter escrever;


	System.out.println("Directoria do ficheiro?\n");

	String pasta = leString();

	pasta=pasta.replace("\r","").replace("\n","");



	File f1= new File (pasta);



	if (f1.exists()){

		System.out.println("Ficheiro encontrado");

		System.out.println("Tamanho do ficheiro:" +f1.length() + " bytes.");

		if(f1.canRead()){

			try{
			leitor = new BufferedReader(new FileReader(f1));

			int tamanho = leitor.read();


			char [] buffer = new char [tamanho];


			leitor.read(buffer);



			System.out.println("Para onde deseja mover o ficheiro?\n");

			String destino = leString();
			destino=destino.replace("\r","").replace("\n","");

			File f2 = new File(destino);

			f2.createNewFile();



			escrever = new BufferedWriter(new FileWriter (f2));

			escrever.write(buffer);

			escrever.flush();

		f1.deleteOnExit();

			System.out.println("\nDone!");

			}
			catch(IOException e){System.out.println(e.getMessage());}


		}

		else{

			System.out.println("Acesso negado ao ficheiro");

		}


	}

	else{
		System.out.println("Ficheiro nao encontrado");

	}

}

}

Limitação: é necessario escrever o nome do ficheiro no caminho de destino. Por exemplo:c:\\Nova pasta\\lol.txt

Problemas: O ficheiro original não é apagado (apesar de eu dar essa instruçao) e o ficheiro novo fica a ocupar mais que o original  ;)

Provavelmente é um erro básico da minha parte  :dontgetit: mas estou só a tentar ajudar  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não percebo muito de java (sou mais .Net) mas olhando só assim por alto diria que falta-te terminar os objectos correctamente (através dos respectivos métodos close).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não percebo muito de java (sou mais .Net) mas olhando só assim por alto diria que falta-te terminar os objectos correctamente (através dos respectivos métodos close).

É isso! Isso resolve o problema de nao apagar o ficheiro de origem!  :biggrin:

Falta acrescentar:

leitor.close();
escrever.close();

para fechar as streams ;)

Obrigado pela correcçao, saco.

No entanto, permanece o problema do ficheiro nao estar igual quando chega ao destino  :)

Poderá o BufferedReader estar a ler o ficheiro de forma incorrecta?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É isso! Isso resolve o problema de nao apagar o ficheiro de origem!  :biggrin:

Falta acrescentar:

leitor.close();
escrever.close();

para fechar as streams ;)

Obrigado pela correcçao, saco.

No entanto, permanece o problema do ficheiro nao estar igual quando chega ao destino  :)

Poderá o BufferedReader estar a ler o ficheiro de forma incorrecta?

Mais uma vez... não sou expert em java, mas o facto de o BufferedReader/BufferedWriter ler/escrever chars poderá dar borrada. Tenta antes com o FileInputStream e FileOutputStream que lê/escreve bytes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Holla!

talvez exista uma forma mais simples do que percebi

    
// File (or directory) to be moved
    File file = new File("filename");
    
    // Destination directory
    File dir = new File("directoryname");
    
    // Move file to new directory
    boolean success = file.renameTo(new File(dir, file.getName()));
    if (!success) {
        // File was not successfully moved
    }

pesquisa

http://www.google.pt/search?q=java+move+file&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pt-PT:official&client=firefox-a

Assim evitava.se ler e escrever cada ficheiro, seria mais rapido creio.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@Saco estava a tentar fazer apenas para um ficheiro de texto, mas pelos vistos assim não é mesmo um bom método  ;)

@joserodrigues realmente essa maneira é muito mais fácil e prática!

De qualquer maneira, consegui pôr o meu programa a funcionar para qualquer ficheiro. Utilizando DataStreams. Aqui vai:

import java.io.*;


public class Mover {

private static String leString () {

	boolean fim = false;
	int ch; 	
	String r = "";
	while (!fim){

			try {
		ch = System.in.read();
		if (ch < 0 || (char)ch=='\n')
		fim = true;
		else
		r = r + (char) ch;
		}

			catch (java.io.IOException e){
		fim = true;
		}
		}
		return r;

	}


public static void main(String[] args) {

	DataInputStream leitor;
	DataOutputStream escrever;

	System.out.println("Directoria do ficheiro?\n");

	String pasta = leString();

	pasta=pasta.replace("\r","").replace("\n","");



	File f1= new File (pasta);

    

	if (f1.exists()){

		System.out.println("Ficheiro encontrado");

		System.out.println("Tamanho do ficheiro:" +f1.length() + " bytes.");

		System.out.println("Para onde deseja mover o ficheiro?\n");

		String destino = leString();
		destino=destino.replace("\r","").replace("\n","");

		File f2 = new File(destino);

		try {
			f2.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		 f1.deleteOnExit();

		if(f1.canRead()){

			try {
				leitor = new DataInputStream (new FileInputStream(f1));

                    escrever = new DataOutputStream (new FileOutputStream(f2));

                    int flag = 1;
                    
                    while(flag != 0){
                    
                    try{	
                    byte lido = leitor.readByte();
                    
                    
                    escrever.writeByte(lido);
                    
                    }catch (EOFException e) {
    					// TODO Auto-generated catch block
    					
                    	flag = 0;
                    }
                    
                    }
                    
				System.out.println("Ficheiro movido:" + f2.length()+ " bytes.\nDone!");

			leitor.close();
			escrever.close();


			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();}







		}	//fim do if




		else{

			System.out.println("Acesso negado ao ficheiro");

		}


	}

	else{
		System.out.println("Ficheiro nao encontrado");

	}

}

}

Usar: Ficheiro de origem colocar por exemplo c:\\lol.doc e no destino por exemplo, c:\\Pasta\\lol.doc

Experimentei para vários tipos de ficheiro e funciona  :)

É muito mais fácil utilizar o file.renameTo mas queria mostrar que assim também era possível  :)

@cristpate

Penso que tens o problema resolvido  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@CoreyTaylor tens então Proof of Concept.

No entanto, a performance é importante? digo isto pois talvez copiar 2GB (byte a byte ainda por cima) seja mais lento que mover...

contudo satisfeito por teres resolvido o problema.  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa questão. Mais uma vez a titulo de curiosidade vou testar as duas maneiras e medir o tempo que demora utilizando o Eclipse profiler :). Depois digo os resultados.

EDIT: Acabei de testar as duas maneiras a mover um ficheiro de aproximadamente 600 megabytes.

O file.renameTo devolve sempre falha ao tentar mover um ficheiro destas dimensões. Não percebi porquê :S, ou seja o boolean retorna sempre false.  :dontgetit:

O meu outro método decorridos 300 segundos ainda só tinha copiado 20 Mb para o destino, portanto pelos meus cálculos demoraria umas 3 horas a copiar o ficheiro completamente xD

P.s.: Copiar/Colar demora cerca de 2,5 min  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@CoreyTaylor qual o teu codigo para o renameTo()?

Consigo renomear sem problemas independente do tamanho do ficheiro.

package testerename;

import java.io.File;

public class Main {

    public static void main(String[] args) {
        try {

            File oldFile = new File(args[0]);

            File newFile = new File(args[1]);

            boolean result = oldFile.renameTo(newFile);

            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Se quiseres mesmo utilizar o metodo read/write sugiro que utilizes um buffer em vez de ler byte a byte. Assim consegues aumentos consideraveis na performance mantendo o teu método original e ajustanto o tamanho do buffer deverás conseguir chegar aos 2.5 min :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tentei fazer isso antes de fazer byte a byte mas como faço para inicializar um buffer com o tamanho do ficheiro? E isso nao ficará a ocupar demasiado em memória no caso de ficheiros grandes?

Quanto ao meu codigo do renameTo() tinha lá um erro crasso, agora ja funciona xD.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se utilizares um buffer com o tamanho do ficheiro sim, no caso de ficheiros grandes iria ocupar bastante memória e poderias estar limitado quanto ao tamanho do ficheiro, e também poderias até nem saber o tamanho do mesmo, uma situação em que poderia acontecer isto seria ao tentar fazer o download de um ficheiro gerado dinamicamente.

No entanto a solução mais utilizada passa por utilizar um buffer com um tamanho pré-definido, e ir lendo blocos desse tamanho até que já não existam mais dados para ler.

O seguinte código talvez ajude:

public static void main(String[] args) {

        String ifilename = args[0];
        String ofilename = args[1];

        int bufferSize = 10240; // 10Kb

        try {            
            //abrir o ficheiro
            FileInputStream fis = new FileInputStream(ifilename);

            //criar o ficheiro de output
            FileOutputStream fos = new FileOutputStream(ofilename);

            byte bytes[] = new byte[bufferSize];
            int bytesRead = 0;

            while((bytesRead = fis.read(bytes)) != -1){

                fos.write(bytes, 0, bytesRead);
            }

            //cleanup
            fis.close();
            fos.close();
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora