Como evitar a exceção do FileNotfound ao executar o Java no Linux devido à sensibilidade do caso?

StackOverflow https://stackoverflow.com/questions/1733770

Pergunta

Meu aplicativo da web é executado no Windows. Eu gostaria de executar meu aplicativo no Linux também. Parece que superou a maioria dos problemas, como separador de caminho, etc.

Problema real agora é eu fico FileNotFoundException Quando o código Java tenta abrir um arquivo, digamos Abc.txt quando apenas abc.txt existe. :(

Não posso continuar alterando todos os nomes de arquivos para minúsculas ou maiúsculas, pois tenho muitos arquivos. Sem alterar o código, essa é alguma maneira possível de evitar isso?

Foi útil?

Solução

Não há como evitar isso como o java.io.File API é dependente do sistema. Você precisa usar o caso certo ao manipular arquivos no Linux/Unix. Na verdade, meu conselho/solução seria seguir convenções rigorosas e portáteis durante o desenvolvimento no Windows (por exemplo, use apenas nomes de arquivos minúsculos ou, melhor, melhor, Use o nome exato do arquivo ao acessá -lo programaticamente). Para ser sincero, não entendo por que você está tentando carregar Abc.txt Quando o nome do arquivo é abc.txt. Este é um mau hábito (ensinado gastando muito tempo no Windows) em vez de um problema de Linux/Unix.

Outras dicas

Consertá-lo!

Qualquer esquema que você concorda para contornar a fixação será pior a longo prazo.

Bem, antes de tudo, eu acho que você deve Considere mudar para um esquema de nomeação consistente, em vez de usar alguma solução alternativa.

Enfim, que tal lendo em todos os nomes de arquivos e colocando -os em um mapa que contém o nome de baixo caso como chave? Você pode então Procure o nome do arquivo correto do mapa.

Isso também permitiria detectar um conflito, por exemplo, dois arquivos "filea.txt" e "filea.txt" no mesmo diretório que têm as mesmas representações de caso inferior; nesse caso, você sabe que precisa resolver o problema em Uma maneira completamente diferente (porque você precisa saber qual você deseja ter aberto, e é ambíguo, e essa solução alternativa não o fará).

Supondo que os arquivos sejam mixados no Linux, não há resposta simples para isso.

O melhor que consigo pensar é ter sua lista de aplicativos os diretórios relevantes e criar uma estrutura de dados de memória dos nomes de arquivos Linux reais. Então, para abrir um arquivo insensível ao caso, você divide o nome do caminho em componentes, pesquise na árvore na memória usando a pesquisa insensível ao caso, bulid o nome do caminho real (sensível ao caso) e use-o para fazer o arquivo aberto.

O problema é que ele (e de fato seu aplicativo) não pode lidar com o caso em que você (digamos) "foo.txt" e "foo.txt" no mesmo diretório Linux.

Mas a melhor solução é alterar seu aplicativo para que funcione com nomes de caminho sensíveis ao caso.

Por que você não pode alterar muitos arquivos? Se a quantidade de arquivos é realmente a única coisa que o impedir, basta escrever um pequeno script que os renomeie todos para casos mais baixos.

Não está claro na sua pergunta o que está causando a alteração do caso de seus arquivos. Se todos os seus arquivos forem minúsculos no Linux, enquanto eles forem mistas no Windows, você pode simplesmente transformar o nome do arquivo em minúsculas, assim:

new File(filename.toLowerCase())

Há uma solução que tem desempenho horrível de tempo de execução, mas é muito simples de implementar:

Substituir new FileReader(name) com algo como

openFile(name);

public FileReader openFile(String name) throws FileNotFoundException {
  File dir = (new File(name)).getParentFile();
  for (File f : dir.listFiles()) {
    if (f.getName().equalsIgnoreCase(name)) {
    return new FileReader(f);
  }
  throw new FileNotFoundException("File not found: " + name);
}

Eu não compilei este código, ele pode ter erros de digitação e bugs. Eu os deixo para você consertar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top