File.exists () retorna false quando o arquivo existe

Eu encontrei um bug eu não consigo encontrar nenhuma lógica por trás. Eu tenho esse object File, que é criado assim:

File file = new File("utilities/data/someTextFile.txt"); 

Eu então faço file.exists() e ele retorna false (!?). Se o arquivo não for encontrado, estou registrando f.getAbsolutePath() em um arquivo. Quando olho para o caminho, parece bem. Eu posso copiar e colar o caminho completo na janela “Executar” no Windows e o arquivo abre bem.

O arquivo existe em todos os momentos e não é excluído nem alterado durante a execução do meu aplicativo. Está localizado na máquina local.

Isso só parece ocorrer em determinadas situações. Eu posso reproduzir a falha a qualquer momento, mas tenho certeza que o caminho do object de arquivo não é alterado pelas ações que eu faço para reproduzir a falha.

O que pode fazer com que file.exists() retorne false? Isso tem algo a ver com permissions ou bloqueios de arquivos, etc.?

Estou vendo a seguinte situação no Windows 7:

 file.exists() == false file.getAbsoluteFile().exists() == true 

O arquivo em questão é “var \ log”, o caminho absoluto se refere a um arquivo existente que está em um subdiretório normal (não em uma loja virtual). Isso é visto no IDE.

Se o processo não tiver permissions para informar se existe um arquivo, ele retornará false. Pode ser possível abrir um arquivo, mas não dizer por methods normais se ele existir.

Parece que há uma diferença em como o caminho é especificado em Java.

Por exemplo, se o caminho do arquivo for especificado como file:/C:/DEV/test.txt ,

 File f = new File(filename); f.exists(); 

retornará false . O caminho pode funcionar no explorador ou no navegador, mas é um URL e não um caminho de arquivo absoluto.

Mas, por outro lado, se o caminho do arquivo for especificado como C:/DEV/test.txt ,

 File f = new File(filename); f.exists(); 

retornará true porque o caminho não é uma URL, mas é um caminho absoluto.

Com o Spring Framework é exatamente o que ResourceUtils.getFile(filename) faz – onde nome pode ser um URL ou o caminho absoluto do arquivo.

As respostas acima não ajudaram no meu caso. Como dito acima, eu tive:

 file.exists() => false file.getAbsoluteFile().exists => true 

A causa principal para isso era que o proprietário da máquina do Windows 7 havia modificado o registro para o CMD para que ele executasse um comando para iniciar em um diretório específico para trabalhar com o Python. Essa modificação prejudicou o código Java 1.6 , que aparentemente usa o CMD no Windows para determinadas operações de arquivo, como exists() . Eliminar o autorun do registro resolveu o problema.

O new File comando new File apenas cria uma instância de um arquivo usando o nome do caminho fornecido. Na verdade, não cria um arquivo no disco rígido.

Se você diz

 File file = new File ("path"); file.exists() 

Isso pode retornar true somente se houver um arquivo existente com o mesmo caminho. Se você pretende verificar o mesmo arquivo declarado na primeira linha, talvez seja necessário usá-lo dessa maneira.

 File file = new File ("path"); file.createNewFile(); file.exists(); 

Agora isso retornará verdadeiro.

Quando [“Ocultar as extensões dos tipos de arquivo conhecidos”] estiver marcado, abra o “t.txt.txt” quando digitar “t.txt” no [explorer] / [run windows] mas não programaticamente.

Boas respostas a todos. Eu encontrei este parece ser um problema com o Java acessar o diretório raiz C: no Windows. Qualquer outro diretório deve ser bom, mas por algum motivo, especificamente mencionando C:\ ou C: ou C:/ pode dar um erro. Eu resolvi este problema muito semelhante por interceptar menção ao new File("C:"); e substituí-lo com o novo File(System.getProperty("file.separator")); ou você deve ser capaz de codificar “\” em vez de dizer “c:” como seu diretório de arquivos e isso pode funcionar. Não é elegante, mas fez o trabalho para mim neste projeto.

Espero que ajude. Pode não ser a solução certa, mas pelo menos funcionou para mim. Estou no JRE 1.6, Win 7 . Felicidades!

Respeitosamente,

@ Carpenter1010

Obviamente, há várias causas possíveis e as respostas anteriores as documentam bem, mas eis como resolvi isso em um caso específico:

Um aluno meu teve esse problema e eu quase arranquei meu cabelo tentando descobrir. Descobriu-se que o arquivo não existia, embora parecesse que sim. O problema é que o Windows 7 foi configurado para “Ocultar extensões de arquivo para tipos de arquivos conhecidos”. Isso significa que se o arquivo parecer ter o nome “data.txt”, seu nome de arquivo real será “data.txt.txt”.

Espero que isso ajude os outros a pouparem algum cabelo.

Se as situações em que ele falhar envolverem executá-lo como outro usuário e você estiver no Windows Vista / Windows 7, isso pode ser causado pelo VirtualStore, o mecanismo em que o Windows permite que um usuário sem privilégios “grave” normalmente não o faça. No entanto, as alterações são armazenadas em “% USERPROFILE% \ AppData \ Local \ VirtualStore \”, que são particulares para cada conta de usuário.

Se você não quiser lidar com as chamadas getAbsoluteFile () toda vez que precisar chamar um método, é melhor criar sua instância de arquivo com um caminho absoluto. Isso deve fazer o truque:

 File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile(); 

Eu sugiro cercá-lo com um bloco try-catch, BTW.

Eu acho que você deveria usar a barra invertida, assim:

Arquivo file = new File (“C: \\ usuário \\ utilitários \\ data \\ someTextFile.txt”); (duas barras invertidas, não um erro de digitação)

Deve resolver o problema 🙂