Preciso acessar um arquivo na rede/servidor

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??

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

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?

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

Últimos testes:

[code]
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);
    }
[/code]

Nenhum deu certo.

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

Novo teste e continua dizendo que o arquivo não existe:

[code] 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 ");
    }[/code]

Resultado:

[quote]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
[/quote]

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.

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?

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

uma duvida…
usando o java.nio eu consigo copiar arquivos pela rede (uma pasta compartilhada para todos) com a seguinte função:

[code]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;
	}
}[/code]

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.

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.

esse “run as” é independente de plataforma?

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

[code]
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();
	}[/code]

ele dá um comando no shell pra “logar” no outro computador… pior que funciona!!

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?..

[code] 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();
} [/code]

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: :frowning:

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);

/*
 * Lê 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();


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: :frowning: :frowning: :frowning: :frowning: :frowning: :frowning: :frowning: :frowning: :cry: :cry: :cry: :cry:

[code] 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();
}
[/code]

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

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:

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: