java.io.FileNotFoundException: C:\Diretorio1\Diretorio2\Diretorio3 (Acesso negado)

4 respostas
W

Boa tarde a todos,
gostaria de uma ajuda no seguinte:
Preciso copiar um arquivo de um diretório para outro. Abaixo seguem os códigos que estou usando e os problemas ocorridos:

O código abaixo retorna [color=red]java.io.FileNotFoundException: C:\Diretorio1\Diretorio2\Diretorio3 (Acesso negado)[/color] Por que Acesso negado se no outro código abaixo é possível copiar para a pasta de destino?
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class CopiaArquivo {

	public static void main(String[] args) throws IOException {

		FileChannel oriChannel = new FileInputStream("C:\\diretorio\\DLLator2.vbs").getChannel();
		FileChannel destChannel = new FileOutputStream("C:\Diretorio1\Diretorio2\Diretorio3 ").getChannel();
		destChannel.transferFrom(oriChannel, 0, oriChannel.size());
		oriChannel.close();
		destChannel.close();
	}
}
Esse código funciona, mas ele move o arquivo do diretório de origem e quando necessitar dele nas outras execuções, ele não existirá, eu preciso que apenas copie para o destino e mantenha o arquivo no diretório de origem. Se alguém tiver outra solução, será bem vinda.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class CopiaArquivo {

	public static void main(String[] args) throws IOException {

File file = new File("C:\\diretorio\\DLLator2.vbs");
		File dir = new File("C:\Diretorio1\Diretorio2\Diretorio3 ");
		boolean success = file.renameTo(new File(dir, file.getName()));
		if (!success) {
			System.out.println("File was not successfully moved"); 
	    }else{
	    	System.out.println("File was successfully moved");
	    }
	}
}

Agradeço qualquer ajuda.

4 Respostas

T

O primeiro código que você mostrou requer 2 nomes de arquivos, mas você passou um nome de arquivo e um nome de diretório. Você precisa pasasr um nome de arquivo para o destino; transferFrom não cria automaticamente um arquivo no destino com o nome desejado.

M

Para manipular arquivos utilize a commons.io da apache.

http://commons.apache.org/io/

Muito bacana.

[]´s
JL

W

Obrigado mais uma vez thingol, funcionou do jeito que vc disse.
Eu havia pesquisado uns códigos na net que tinham somente o diretório de destino sem acrescentar o nome do arquivo.

Segue o código funcionando para quem se interessar.

import java.io.FileInputStream;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.nio.channels.FileChannel;   
  
public class CopiaArquivo {   
  
    public static void main(String[] args) throws IOException {   
  
        FileChannel oriChannel = new FileInputStream("C:\\diretorio\\DLLator2.vbs").getChannel();   
        FileChannel destChannel = new FileOutputStream("C:\Diretorio1\Diretorio2\Diretorio3\\DLLator2.vbs ").getChannel();   
        destChannel.transferFrom(oriChannel, 0, oriChannel.size());   
        oriChannel.close();   
        destChannel.close();   
    }   
}
T

Só vou dizer que transferFrom ou transferTo pode ter problemas com arquivos um pouco grandes.
Se o arquivo for um pouco grande (digamos 100 MB ou mais), é melhor quebrar a transferência em pedaços.
Seria algo mais ou menos assim:

long oriSize = oriChannel.size();
        long partSize = 10L * 1024 * 1024;
        int nParts = (int) ((oriSize + partSize - 1) / partSize);
        for (int i = 0; i < nParts; ++i) {
            if (i + 1 == nParts) {
                destChannel.transferFrom(oriChannel, i * partSize, oriSize % partSize == 0 ? partSize : oriSize % partSize);  
            } else {
                destChannel.transferFrom(oriChannel, i * partSize, partSize);  
            }
        }
Criado 13 de maio de 2009
Ultima resposta 13 de mai. de 2009
Respostas 4
Participantes 3