Preciso acessar um arquivo na rede/servidor

27 respostas
J

Preciso muito saber como eu faço isso:

String AQUIVO_DB = "SERVIDOR1:\\C:\\Kooky\\SigGraf\\dados\\SIGRAF_STD.FDB"; String ARQUIVO_ZIP = "C:\\Kooky\\SigGraf\\dados\\"; boolean exists = (new File(AQUIVO_DB)).exists();

Ou seja, criar um ponteiro para manipular um arquivo na rede (nesse caso em um servidor).

Como??

27 Respostas

J

Tentei assim:

File teste = new File("file:///localhost:C:\\Kooky\\SigGraf\\dados\\SIGRAF_STD.FDB"); if(teste.exists()){ System.out.println("== DEU CERTO == "); } else { System.out.println("== N A O D E U C E R T O"); }

== N A O D E U C E R T O

T

Primeira coisa - se você sabe usar o Windows Explorer, a sintaxe para acessar um arquivo de servidor é

\servidor\share\diretorio\arquivo,

ou no Java,

“\\servidor\share\diretorio\arquivo”.

No seu caso, algum diretório do servidor deve ter sido compartilhado. Digamos que o compartilhamento tenha o nome “cookie” e tenha sido feito para o diretório c:\kooky\siggraf. Então a sintaxe seria:

\servidor1\cookie\dados\sigraf_std.fdb,

ou no Java,

“\\servidor1\cookie\dados\sigraf_std.fdb”.

OK?

J

Se eu entendi bem não deu certo.

Tenho na máquina local a pasta Teste compartilhada com um arquivo, fiz isso:

teste = new File("\\\\localhost\\Teste\\\\ARQUIVO_TESTE.TXT"); if (teste.exists()) { System.out.println("== DEU CERTO == "); } else { System.out.println("== N A O D E U C E R T O"); }

== N A O D E U C E R T O

J
Últimos testes:
File teste = new File("file:///localhost:C:\\Teste\\ARQUIVO_TESTE.TXT");
        if (teste.exists()) {
            System.out.println("== DEU CERTO == ");
        } else {
            System.out.println("== N A O   D E U   C E R T O");
        }

        teste = new File("\\\\localhost\\Teste\\ARQUIVO_TESTE.TXT");
        if (teste.exists()) {
            System.out.println("== DEU CERTO == ");
        } else {
            System.out.println("== N A O   D E U   C E R T O");
        }

        try {
            URI uri = new URI("file:///localhost:C:/Teste/ARQUIVO_TESTE.TXT");
            teste = new File(uri);
            if (teste.exists()) {
                System.out.println("== DEU CERTO == ");
            } else {
                System.out.println("== N A O   D E U   C E R T O");
            }
        } catch (URISyntaxException ex) {
            Logger.getLogger(CopiaSegurancaUI.class.getName()).log(Level.SEVERE, null, ex);
        }

Nenhum deu certo.

T

Não pode usar localhost, porque esse não deve ser o nome de uma máquina na sua rede. É necessário usar o nome correto da máquina, ou então o IP numérico. Por exemplo:

\123.45.67.89\share\diretorio\arquivo

J
Novo teste e continua dizendo que o arquivo não existe:
String serverName = "127.0.0.1";
        String str = "file:///" + serverName + ":C:\\Teste\\ARQUIVO_TESTE.TXT";
        File teste = new File(str);
        if (!teste.exists()) {
            System.out.println(str + " NÃO EXISTE ");
        }
        str = "///" + serverName + "//C:/Teste/ARQUIVO_TESTE.TXT";
        teste = new File(str);
        if (!teste.exists()) {
            System.out.println(str + " NÃO EXISTE ");
        }

        serverName = "192.168.1.102";
        str = "file:///" + serverName + ":C:\\Teste\\ARQUIVO_TESTE.TXT";
        teste = new File(str);
        if (!teste.exists()) {
            System.out.println(str + " NÃO EXISTE ");
        }
        str = "///" + serverName + "//C:/Teste/ARQUIVO_TESTE.TXT";
        teste = new File(str);
        if (!teste.exists()) {
            System.out.println(str + " NÃO EXISTE ");
        }

Resultado:

file:///127.0.0.1:C:\Teste\ARQUIVO_TESTE.TXT NÃO EXISTE
///127.0.0.1//C:/Teste/ARQUIVO_TESTE.TXT NÃO EXISTE
file:///192.168.1.102:C:\Teste\ARQUIVO_TESTE.TXT NÃO EXISTE
///192.168.1.102//C:/Teste/ARQUIVO_TESTE.TXT NÃO EXISTE

T

Você nunca mexeu com Windows? Você não pode acessar o drive C: diretamente. Um diretório do Windows tem de estar shareado.

(OK, ok, normalmente o drive C: do Windows é shareado como “C$”, mas o usuário que precisa acessar esse share tem de ter direitos administrativos nessa máquina Windows, portanto não é aconselhável usar o C$ em condições normais).

Se você estiver em uma máquina Linux ou Unix, aí a história é outra. Você tem de montar (mount) esse tal diretório shareado do Windows para um diretório de sua máquina Linux.

Mas você nunca pode pôr esse “:” no meio do nome do arquivo.

J

Ok, agora funcionou:

String serverName = "127.0.0.1"; serverName = "192.168.1.102"; String str = "file:///" + serverName + ":C:\\Teste\\ARQUIVO_TESTE.TXT"; str = "///" + serverName + "//Teste/ARQUIVO_TESTE.TXT"; File teste = new File(str); if (!teste.exists()) { System.out.println(str + " NÃO EXISTE "); } else { System.out.println("Ok - "+str+" EXISTE"); }Agora a pergunta é: uma vez que minha aplicação roda com um certificado de segurança e tem acesso a máquina e a rede (criar arquivos, excluir arquivos, enviar por email, receber, enviar por FTP, receber por FTP), não teria como eu acessar esse diretório sem a necessidade de ele estar compartilhado?

T

Isso é coisa do Windows. Acesso direto a arquivos deve ser feito em diretórios compartilhados e com o usuário correto.

M
uma duvida... usando o java.nio eu consigo copiar arquivos pela rede (uma pasta compartilhada para todos) com a seguinte função:
public static boolean copiarArquivo(String origem, String destino){
		try {
			// Create channel on the source
			FileChannel srcChannel = new FileInputStream(origem).getChannel();

			// Create channel on the destination
			FileChannel dstChannel = new FileOutputStream(destino).getChannel();

			// Copy file contents from source to destination
			dstChannel.transferFrom(srcChannel, 0, srcChannel.size());

			// Close the channels
			srcChannel.close();
			dstChannel.close();
			return true;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}

com um caminho tipo: "\\10.1.1.9\informatica"

mas e se a pasta precisar de autenticação ou um usuario diferente do meu (logado)?
tipo: num computador em um dominio e eu consigo acessar uma pasta compartilhada pelo explorer "logando" nele com um usuário e senha.
esse procedimento poderia ser feito num programa em tempo de execução??

acabei de fazer um teste enquanto postava e retornou o seguinte:

java.io.FileNotFoundException: \\10.1.1.9\informatica (Falha de logon: nome de usuário desconhecido ou senha incorreta)

tem como passar o usuario e senha na "url" do caminho? como num ftp?

obrigado.

T

Se seu programa estiver rodando sob Windows, é necessário iniciá-lo com o comando runas. Por exemplo:

runas /user:dominio\usuario "java -jar MeuJar.jar"

Aí ele vai pedir a senha desse usuário quando você iniciar o programa.

M

esse "run as" é independente de plataforma?

eu pesquisei um esquema que funciona, mas achei que é muita acoxambração:

String serverName = "10.1.1.9";
		String shareName = "informatica";
		String userName = "usuario";
		String password = "senha";
		
		
		String cmdLine = "cmd /c net use \\\\" + serverName + "\\" + shareName + " " + password + " /user:" + userName + " /persistent:no";
		
		System.out.println(cmdLine);
				
		Process p = Runtime.getRuntime().exec(cmdLine);
        try {
			p.waitFor();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

ele dá um comando no shell pra "logar" no outro computador... pior que funciona!!

R

Mendonca,

Achou uma forma mais “elegente” de autenticar na rede? Via esse shell funciona, mas nao deve ser compativel com servidores que não sejam windows correto?..

F
String serverName = "10.1.1.9";  
String shareName = "informatica";  
String userName = "usuario";  
String password = "senha";  
  
  
String cmdLine = "cmd /c net use \\\\" + serverName + "\\" + shareName + " " + password + " /user:" + userName + " /persistent:no";  
  
System.out.println(cmdLine);  
          
Process p = Runtime.getRuntime().exec(cmdLine);  
      try {  
    p.waitFor();  
} catch (InterruptedException e1) {  
    // TODO Auto-generated catch block  
    e1.printStackTrace();  
}

desculpe pessoal, mas eu queria saber o inicio e o fim para este código funcionar
alguma alma boa pode terminar de fazer o codigo para mim que so seja preciso compilar e rodar? eu não sei como começar este código e nem como terminar, por favor ai gente me de uma maozinha!!!!! :oops: :(

R

Opa!

Eu acabei usando a biblioteca jcifs na época. Me atendeu muito bem.

import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

[....]

System.setProperty("jcifs.smb.client.username", usuario);
System.setProperty("jcifs.smb.client.password", senha);

/*
 *  o path onde o arquivo vai ser gerado,
 * o formato é:
 * file://192.168.0.100/xpto/"
 * onde 192.168.0.100 é o ip da maquina
 * ou
 * file://sputinik/xpto/"
 * onde sputinik é o nome da maquina
 */
SmbFile f = new SmbFile(filePath);

//Abre o arquivo
SmbFileOutputStream out = new SmbFileOutputStream(f);
//Escreve o conteúdo do arquivo
out.write(data);
//Fecha o arquivo e o libera para ser usado por outra aplicação
out.close();
F

por caridade alguém pode me ajudar com esse código do colega para ele funcionar?? eu não sei que nome eu salvo ele .java . não sei o que devo colocar no inicio do código e nem do fim :oops: :oops: :oops: :oops: :( :( :( :( :( :( :( :( :cry: :cry: :cry: :cry:

String serverName = "10.1.1.9";    
String shareName = "informatica";    
String userName = "usuario";    
String password = "senha";    
    
    
String cmdLine = "cmd /c net use \\\\" + serverName + "\\" + shareName + " " + password + " /user:" + userName + " /persistent:no";    
    
System.out.println(cmdLine);    
            
Process p = Runtime.getRuntime().exec(cmdLine);    
      try {    
    p.waitFor();    
} catch (InterruptedException e1) {    
    // TODO Auto-generated catch block    
    e1.printStackTrace();    
}
F

eu não endendi ronaldocwb você deu outro código? :smiley:

R

Sim! Eu usei outra solução. A que eu postei acima.

Mas se você não conhece Java muito bem sugiro que peça um apoio a alguem, pois não é uma atividade tão trivial e pode dar problemas de ambiente para ambiente.

:thumbup:

F

ronaldocwb Ronaldo eu não sei se é permitido falar isso aqui no forum mas existe algum meio de te pagar um dinheiro para você consertar esse código do colega para eu finalmente aprender como abrir programa em rede usando java? :twisted:

E

Pergunta boba número 1. Você sabe acessar um arquivo na rede do Windows pelo Windows Explorer?
Pergunta boba número 2. Você sabe como mapear um drive?

R

Ferrarini,

Não sei se existe problema, mas eu uso o forum como uma fonte de pesquisa e um ambiente onde as pessoas se ajudam sem fins lucrativos.

Vou anexar uma classe para voce testar no seu ambiente. É só passar os parâmetros para o metodo estático writeNetworkFile.

Anexei um jar também que deve estar no classpath da sua aplicação

Espero que ajude!

F

entanglement:
Pergunta boba número 1. Você sabe acessar um arquivo na rede do Windows pelo Windows Explorer?
Pergunta boba número 2. Você sabe como mapear um drive?

MP

P

Tem como fazer isso sendo que o sharename é uma partição F do HD windows 2003 de um servidor? Valeu

P

ronaldocwb , teria como copiar aquele arquivo ou somente referencia-lo para ser enviado como anexo pela API JavaMail, a sua classe e o jcfs foram os únicos que funcionaram.

public void writeNetworkFile(String usuario, String senha, String filePath, byte[] data) throws Exception {
		
		//Lê no nome de usuario 
		System.setProperty("jcifs.smb.client.username", usuario);
		//Lê a senha 
		System.setProperty("jcifs.smb.client.password", senha);                
                
		
		/*
		 * Lê o path onde o arquivo vai ser gerado,
		 * o formato X:
		 * file://192.168.0.100/Users/xpto/"
		 * onde 192.168.0.100 é o ip da maquina
		 * ou
		 * file://sputinik/Users/xpto/"
		 * onde sputinik e o nome da maquina
		 */
		SmbFile f = new SmbFile(filePath);
		
		//Abre o arquivo
        SmbFileOutputStream out = new SmbFileOutputStream(f);
        //Escreve o conteudo do arquivo
        out.write(data);
        //Fecha o arquivo e o libera para ser usado por outra aplica��o
        out.close();
	}
P

Eu implementei essa classe para tentar copiar um arquivo html no servidor e copiar ele para a máquina onde rodo um programa mas está dando um erro , até esta sexta estava funcionando mas hoje parou segue o erro:

Jul 11, 2012 12:00:28 PM automaticnewsletter.IO.IO copia
Grave: null
jcifs.smb.SmbException: 
jcifs.util.transport.TransportException: Transport2 timedout waiting for response to SmbComSessionSetupAndX[command=SMB_COM_SESSION_SETUP_ANDX,received=false,errorCode=0,flags=0x0018,flags2=0xC003,signSeq=0,tid=0,pid=21503,uid=0,mid=2,wordCount=13,byteCount=57,andxCommand=0x75,andxOffset=118,snd_buf_size=16644,maxMpxCount=10,VC_NUMBER=1,sessionKey=0,passwordLength=0,unicodePasswordLength=0,capabilities=4180,accountName=Guest,primaryDomain=PEDRO-123,NATIVE_OS=Linux,NATIVE_LANMAN=jCIFS]
	at jcifs.util.transport.Transport.sendrecv(Transport.java:74)
	at jcifs.smb.SmbTransport.send(SmbTransport.java:580)
	at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:264)
	at jcifs.smb.SmbSession.send(SmbSession.java:223)
	at jcifs.smb.SmbTree.treeConnect(SmbTree.java:144)
	at jcifs.smb.SmbFile.connect(SmbFile.java:792)
	at automaticnewsletter.IO.IO.copia(IO.java:87)
	at automaticnewsletter.Main.main(Main.java:48)

	at jcifs.smb.SmbTransport.send(SmbTransport.java:585)
	at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:264)
	at jcifs.smb.SmbSession.send(SmbSession.java:223)
	at jcifs.smb.SmbTree.treeConnect(SmbTree.java:144)
	at jcifs.smb.SmbFile.connect(SmbFile.java:792)
	at automaticnewsletter.IO.IO.copia(IO.java:87)
	at automaticnewsletter.Main.main(Main.java:48)

segue o código

//file://192.168.0.100/xpto/"
            System.setProperty("jcifs.smb.client.username", "user_pedro");  
            System.setProperty("jcifs.smb.client.password", "fast7002"); 
          
           
            try 
            {
                sb= new SmbFile("file://192.168.50.4/id000003/index.html");
                NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("PEDRO-123","Guest","");
                sp=new SmbFile("file://PEDRO-123/ASP/index266.html", auth);                               
                sp.createNewFile();
                sp.setAttributes(sb.getAttributes());                
                sb.copyTo(sp);   
            } 
            catch (MalformedURLException | SmbException ex) 
            {
                Logger.getLogger(IO.class.getName()).log(Level.SEVERE, null, ex);
            }

O meu problema é que eu estou rodando linux ubuntu e o server é win2003.

Valeu

E

Queria fazer uma pergunta. Seria possível você montar esse arquivo no seu filesystem, em vez de tentar usar o JCIFS? Acho que é mais prático.

Normalmente você usa uma meia-dúzia de comandos, parecidos com os seguintes:

http://cri.ch/linux/docs/sk0001.html

Alguns desses comandos você usa “sudo” para executá-los, se for o caso.

P

Já testei isso e realmente funciona porem este programa não irá ficar rodando sobre meu pc, ele irá ficar com o pessoal de marketing que usa a plataforma Windows xp eu só estou corrigindo os erros e criando uma versão nova.

Criado 22 de maio de 2009
Ultima resposta 11 de jul. de 2012
Respostas 27
Participantes 7