Como adicionar mais uma \ (barra) no endereço do diretório

Bom dia a todos,

Queria saber como faço para acrescentar mais uma \ (barra) no endereço do diretório?

estou com uma String que recebe o diretório de um arquivo selecionado por uma fileupload, essa string é setada numa FileInputStream,
mas só que a FileInputStream só irar buscar esse arquivo se o endereço dele estiver com duas \ (barras).
exe.: D:\MeusAqruivos\conta.txt

veja o código:

[code]public void onUpload$fupPesquisa(UploadEvent event) throws FileNotFoundException {
org.zkoss.util.media.Media media = event.getMedia();
File myFile = new File(media.getName());
String end = myfile.getAbsolutePath();

FileInputStream is = new FileInputStream(end);

}[/code]

Mensagem de erro que esta dando:

[color=red]D:\MeusArquivos\conta.txt (O sistema não pode encontrar o arquivo especificado)[/color]

como disse logo acima o erro é devido o endereço estar com apenas uma barra.

fico grato se alguem poder me ajudar

para facilitar o entendimento do metodo acima,

é mesma coisa dele ser assim:

String endereco = "D:\MeusAqruivos\conta.txt"; FileInputStream is = new FileInputStream(endereco);

uma barra invertida “” é um caractere especial nas Strings java, é o escape.

Significa que o caractere a frente dele deve ser tratado como um caractere literal, se ele tinha alguma funcionalidade especial, deixa de ter.

Portanto como o próprio caractere “” é especial, se você quer ter uma barra literal precisa escapá-lo “\”

Apesar de terem 2 barras ela ainda só representa uma. Portanto se quiser 2 barras invertidas literais, vai ter que fazer o processo denovo “\\”

Agora só pra função de informação, em Java isso:File file = new File("C:\\pasta\\arquivo.txt"); É o mesmo que: File file = new File("C:/pasta/arquivo.txt");

Utilize o atributo publico da classe File:

    String separator = File.separator;

Isto evita grandes erros e evita a checagens desnecessárias de arquitetura…

Att :slight_smile:

digaoneves esse é o problema cara, como vou usar um fileupload entao o caminho pode ser qual quer um,

supondo que eu busquei no fileupload o arquivo que se encontra nesse caminho: C:\pasta\arquivo.txt
então a String irar receber esse caminho.
mas so que agora pro FileInputStream aceitar o caminho informado tem que mudar o nome do caminho,
ou seja, onde tiver uma barra “” tenho que acrescentar mais uma (para que o java interprete como uma barra “”)

então preciso de uma solução que transforma essa “” em duas “\” ou numa barra invertida “/”

Vc tem certeza que seu problema é causado pela falta de 2 barras?

Normalmente é necessario utilizar 2 barras quando vc gera a url, isso ocorre pela barras ser considerado um “escape”.

Como vc esta utilizando o metodo myfile.getAbsolutePath() a url do arquivo já é pra vir no formato correto.

Posso estar falando besteira, mais creio que seu problema ocorre por vc pegar o arquivo que veio por upload e tentar abrir sem ter salvo ele em disco.

[quote=Lucas Abbatepaolo]Vc tem certeza que seu problema é causado pela falta de 2 barras?

Normalmente é necessario utilizar 2 barras quando vc gera a url, isso ocorre pela barras ser considerado um “escape”.

Como vc esta utilizando o metodo myfile.getAbsolutePath() a url do arquivo já é pra vir no formato correto.

Posso estar falando besteira, mais creio que seu problema ocorre por vc pegar o arquivo que veio por upload e tentar abrir sem ter salvo ele em disco.[/quote]

ja fiz o teste, o getAbsolutePatth() a url do arquivo vem com uma barra.

veja todo o codigo para entender melhor o que vem depois de informa a url no FileInputStream

[code]InputStream is = new FileInputStream(url);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
ArrayList<String> dados = new ArrayList<String>();

String linha = br.readLine(); // primeira linha
// String cabecalho1 = "Nº Aquisição Horário Data Pressão [mca]";
String cabecalho2 = "Num. Registro Horário Data Canal 1 Canal 2";

  while (linha != null) { // inicia laço
    if (linha.equalsIgnoreCase(cabecalho2)) { // quando encontra a linha do cabeçalho ele para
      break;
    }
    linha = br.readLine();
  }

  linha = br.readLine(); // pega a proxima linha
  while (linha != null) { // inicia laço
    dados.add(linha); // armazena as linhas em uma lista
    linha = br.readLine();
  }

  br.close();

  for (int i = 0; i &lt; dados.size(); i++) {


    String[] separados = dados.get(i).split(&quot;\\s+&quot;); // retira os espaços entre os dados deixando apenas um.
      System.out.println(separados);

      for (String separado : separados) {

      
          System.out.println(separado + &quot; &quot;);

    }

  }[/code]

apos eu informa a url no FileInputStream

ele fara tudo esse tratamento do arquivo txt, para armazena seus dados numa Arraylist

Se em Runtime, no momento em que você instancia o FileInputStream, a String tiver somente 1 barra, tudo está correto, é assim que deveria ser.

Seu problema está em outro lugar.

[quote=digaoneves]Se em Runtime, no momento em que você instancia o FileInputStream, a String tiver somente 1 barra, tudo está correto, é assim que deveria ser.

Seu problema está em outro lugar.[/quote]

o erro esta justamente nessa linha InputStream is = new FileInputStream(url);

e ele diz que o arquivo não esta sendo encontrado, e eu fiz um teste para ver se a url passada esta vindo apenas com uma barra

fiz uma textbox para receber o nome da url, e justamente o nome esta vindo C:/pasta/arquivo.txt

E por acaso esse arquivo existe no seu disco ?

Vou explicar o que eu entendo que ocorre neste trecho de codigo:

public void onUpload$fupPesquisa(UploadEvent event) throws FileNotFoundException {  
    //não conheço esta biblioteca e não sei pra que serve..rs
    org.zkoss.util.media.Media media = event.getMedia();   
    
    //gera um arquivo a partir do nome da media...ou seja...somente a referencia de um arquivo vazio..
    File myFile = new File(media.getName());  

    //armazena o caminho absoluto do arquivo
    String end = myfile.getAbsolutePath();  
  
    //tenta gerar um inputStream passando uma url..ou seja..este arquivo não existe
    FileInputStream is = new FileInputStream(end);  
}  

faça um debug do codigo e verifique se segue pelo q estou falando…
espero ter ajudado…

Oi ulysses,

Primeiro peço que não se ofenda caso já saiba de tudo q vou falar, mas já vi várias pessoas com esse tipo de confusão algumas vezes.

Isso que você está fazendo (ler o caminho de um arquivo enviado por upload) só funcionaria se o cliente (internet explorer) e servidor estivessem na mesma máquina.
Normalmente o servidor não conseguirá acessar o arquivo original, a não ser o stream recebido pelo upload. Isso que você está tentando fazer, a não ser que seja uma necessidade bem específica, está conceitualmente errado.
O correto seria ler o stream recebido. O caminho/nome do arquivo pode ser armazenado para usar como uma descrição ou para um futuro download do arquivo, mas não é uma boa ideia confiar nessa informação.
Enfim, o upload não foi feito para ler o arquivo direto do local original.

Além disso, tome cuidado pois somente o Internet Explorer envia o caminho completo do arquivo em uploads.
E pior, o IE envia errado, pois já fiz uma funcionalidade de uploads usando JAX-RS e o caminho que chegava no HEADER do upload era “c:\pasta\arquivo”, porém segundo a especificação do HTTP o HEADER HTTP deveria ter barras duplas, ou seja, um escape. Nesse caso, o Jersey (implementação do JAX-RS) retornava “c:pastaarquivo” como nome do arquivo. Resolvi o problema fazendo um parse do HEADER e recuperando o caminho manualmente. Na ocasião, eu somente armazenava o nome do arquivo como referência para quem enviou, ou seja, como um título default.
Talvez seja esse o seu problema também.

[quote=utluiz]Oi ulysses,

Primeiro peço que não se ofenda caso já saiba de tudo q vou falar, mas já vi várias pessoas com esse tipo de confusão algumas vezes.

Isso que você está fazendo (ler o caminho de um arquivo enviado por upload) só funcionaria se o cliente (internet explorer) e servidor estivessem na mesma máquina.
Normalmente o servidor não conseguirá acessar o arquivo original, a não ser o stream recebido pelo upload. Isso que você está tentando fazer, a não ser que seja uma necessidade bem específica, está conceitualmente errado.
O correto seria ler o stream recebido. O caminho/nome do arquivo pode ser armazenado para usar como uma descrição ou para um futuro download do arquivo, mas não é uma boa ideia confiar nessa informação.
Enfim, o upload não foi feito para ler o arquivo direto do local original.

Além disso, tome cuidado pois somente o Internet Explorer envia o caminho completo do arquivo em uploads.
E pior, o IE envia errado, pois já fiz uma funcionalidade de uploads usando JAX-RS e o caminho que chegava no HEADER do upload era “c:\pasta\arquivo”, porém segundo a especificação do HTTP o HEADER HTTP deveria ter barras duplas, ou seja, um escape. Nesse caso, o Jersey (implementação do JAX-RS) retornava “c:pastaarquivo” como nome do arquivo. Resolvi o problema fazendo um parse do HEADER e recuperando o caminho manualmente. Na ocasião, eu somente armazenava o nome do arquivo como referência para quem enviou, ou seja, como um título default.
Talvez seja esse o seu problema também.[/quote]

Realmente é isso mesmo cara,

eu fui analisar direitinho, passei um monte de vez no debug,

o arquivo que eu informo no upload esta no caminho C:/pasta/arquivo.txt;
mas só que o a String esta referenciando no servidor D:\desenv\eclipse\arquivo.txt

por isso que não esta achando o arquivo, qual poderia ser uma solução para esse caso, existe algum jeito deu pegar o caminho exato mesmo o servidor estando em outra maquina?

[quote=Lucas Abbatepaolo]Vou explicar o que eu entendo que ocorre neste trecho de codigo:

public void onUpload$fupPesquisa(UploadEvent event) throws FileNotFoundException {  
    //não conheço esta biblioteca e não sei pra que serve..rs
    org.zkoss.util.media.Media media = event.getMedia();   
    
    //gera um arquivo a partir do nome da media...ou seja...somente a referencia de um arquivo vazio..
    File myFile = new File(media.getName());  

    //armazena o caminho absoluto do arquivo
    String end = myfile.getAbsolutePath();  
  
    //tenta gerar um inputStream passando uma url..ou seja..este arquivo não existe
    FileInputStream is = new FileInputStream(end);  
}  

faça um debug do codigo e verifique se segue pelo q estou falando…
espero ter ajudado…
[/quote]

Lucas Abbatepaolo essa biblioteca é do Framework ZK ela é um objeto de mídia, que pode ser um PDF, TXT, DOC, etc
agora esse event é a referencia do arquivo selecionado em sua maquina.

:smiley:

Não existe solução padrão para recuperar um arquivo diretamente da máquina do usuário. Isso não faz parte da arquitetura web.
A forma padrão de se fazer uploads é:

  1. O usuário seleciona um arquivo e clica num botão “enviar” que submete o form
  2. O navegador do usuário lê o arquivo local e transmite o conteúdo para o servidor como parte do corpo da requisição HTTP (o nome do arquivo acompanha essa requisição)
  3. O servidor recebe a requisição num stream de dados
  4. O framework decodifica o conteúdo, inclusive o arquivo (no caso do zk, pelo que entendi, ele salva o stream recebido num arquivo no servidor, como uma cópia do original)
  5. O código do seu sistema trata os dados recebidos de acordo com os requisitos

Se, por algum motivo, você precisa acessar os dados locais do usuário, então você precisa de uma alternativa ao fileupload.

  1. Poderia escrever um applet para acessar o arquivo direto do navegador do usuário
  2. Se o navegador for sempre IE, você pode escrever um javascript usando um ActiveX chamado FileSystem para obter acesso ao sistema local
  3. Uma solução paliativa é que os arquivos estejam numa pasta compartilhada em algum servidor da rede, onde usuário e servidor tenham o mesmo tipo de acesso

Não recomendo essas soluções e não sei como implementá-las nesse framework, pois nunca o usei.

Tem algum motivo específico para precisar acessar o arquivo na máquina do usuário?