Eu encontrei um bug que não consigo encontrar nenhuma lógica por trás. Eu tenho este objeto File, que é criado assim:
File file = new File("utilities/data/someTextFile.txt");
Então eu faço file.exists()
, e ele retorna false
(!?). Se o arquivo não for encontrado, estou logando f.getAbsolutePath()
em um arquivo. Quando eu olho para o caminho, parece OK. Posso copiar e colar o caminho completo na janela "Executar" do Windows e o arquivo abre corretamente.
O arquivo existe o tempo todo e não é excluído nem alterado durante a execução do meu aplicativo. Ele está localizado na máquina local.
Isso só parece ocorrer em certas situações. Posso reproduzir a falha a qualquer momento, mas tenho certeza de que o caminho do objeto de arquivo não é alterado pelas ações que faço para reproduzir a falha.
O que pode causar um file.exists()
retorno falso? Isso tem algo a ver com permissões ou bloqueios de arquivos, etc.?
Respostas:
Estou vendo a seguinte situação no Windows 7:
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.
fonte
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
thenvai voltar
false
. O caminho pode funcionar no explorer 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
thenretornará
true
porque o caminho não é um URL, mas é um caminho absoluto.Com o Spring Framework, é exatamente isso o que
ResourceUtils.getFile(filename)
faz - onde o nome pode ser uma URL ou o caminho absoluto do arquivo.fonte
file:/C:/DEV/test.txt
funcionar como um nome de caminho. É um URL, não um nome de caminho. Embora algumas pessoas cometam esse erro, não há evidências de que o OP tenha ...Se o processo não tiver permissão para informar se um arquivo existe, ele retornará falso. Pode ser possível abrir um arquivo, mas não saber por métodos normais se ele existe.
fonte
As respostas acima não ajudaram no meu caso. Conforme declarado acima, eu tinha:
A causa raiz disso foi que o proprietário da máquina com Windows 7 modificou o registro do CMD para que um comando fosse executado automaticamente em um diretório específico para funcionar com Python. Essa modificação incapacitou o código Java 1.6 que aparentemente usa CMD no Windows para certas operações de arquivo, como
exists()
. Eliminar a execução automática do registro resolveu o problema.fonte
()
estão faltando na segunda linha depoisexists
; )Obviamente, existem várias causas possíveis e as respostas anteriores as documentam bem, mas aqui está 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 era que o Windows 7 estava configurado para "Ocultar as extensões dos tipos de arquivo conhecidos". Isso significa que se o arquivo parece ter o nome "data.txt", seu nome de arquivo real é "data.txt.txt".
Espero que isso ajude outras pessoas a economizar algum cabelo.
fonte
O
new File
comando apenas cria uma instância de um arquivo usando o nome de caminho fornecido. Na verdade, ele não cria um arquivo no disco rígido.Se você diz
Isso pode retornar verdadeiro apenas se houver um arquivo existente com o mesmo caminho. Se você pretendia verificar o mesmo arquivo declarado na primeira linha, pode ser necessário usá-lo dessa forma.
Agora, isso vai voltar verdadeiro.
fonte
Se você não quiser lidar com chamadas getAbsoluteFile () cada vez que precisar chamar um método, é melhor criar sua instância de arquivo já com um caminho absoluto. Isso deve resolver o problema:
Eu sugiro cercá-lo com um bloco try-catch, BTW.
fonte
Para generalizar o problema, o problema surge durante a conversão de URL / URI em caminhos locais.
Espero que isto ajude.
fonte
Quando ["Ocultar as extensões dos tipos de arquivo conhecidos."] Está marcado, o windows abre "t.txt.txt" ao digitar "t.txt" no [explorer] / [run windows], mas não programaticamente.
fonte
Boas respostas a todos. Descobri que isso parece ser um problema com o acesso do Java ao
C:
diretório raiz no Windows. Qualquer outro diretório deve servir, mas por algum motivo, especificamente mencionandoC:\
ouC:
ouC:/
pode apresentar um erro. Resolvi este problema muito semelhante bloqueando a mençãonew File("C:");
e substituindo-a por newFile(System.getProperty("file.separator"));
ou você deve ser capaz de codificar "\" em vez de dizer "c:" como seu diretório de arquivo e 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. Eu estou em
JRE 1.6, Win 7
. Felicidades!Respeitosamente,
@ Carpenter1010
fonte
Se as situações de falha envolverem executá-lo como outro usuário e você estiver no Windows Vista / Windows 7, pode ser causado pelo VirtualStore, o mecanismo pelo qual o Windows permite que um usuário sem privilégios "escreva" em locais que normalmente não pode. No entanto, as alterações são armazenadas em "% USERPROFILE% \ AppData \ Local \ VirtualStore \", que são privadas para cada conta de usuário.
fonte
Quando nada de cima funcionou para mim, tentei
Isso irá limpar sua string de qualquer caractere indesejado
fonte
Recentemente me deparei com esse mesmo problema. O que fiz foi desinstalar o Netbeans, excluir a pasta netbeans da unidade C, arquivos de programa, atualizar, programData, virtualmente em todos os lugares. Em seguida, reinstale. Agora está funcionando bem. Não se esqueça de fazer backup da pasta do projeto netbeans antes de realizar as ações acima.
Espero que ajude.
fonte
Com algum IDE (pode ser) e / ou com algum SO (ex: janela), por padrão eles não têm acesso de gravação nos arquivos. Portanto, se você tentar fazer file.exists (), será exibido false. a fim de consertar isso, faça como abaixo
se sua variável ref para Arquivo for f, exemplo: Arquivo f = novo Arquivo ("caminho");
então, para fazê-lo funcionar, selecione f com o mouse e vá para o menu Pesquisar> Acesso de gravação> Área de trabalho. Espero que funcione.
fonte
Acho que você deveria usar barra invertida, assim:
File file = new File ("C: \\ User \\ utilities \\ data \\ someTextFile.txt"); (duas barras invertidas, não é um erro de digitação)
Deve resolver o problema :)
fonte