Come evitare eccezione FileNotFound durante l'esecuzione di Java su Linux a causa del caso sensibilità?

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

Domanda

La mia applicazione web funziona su Windows. Vorrei fare funzionare la mia applicazione su Linux anche. Mi sembra di aver superato la maggior parte dei problemi come separatore di percorso, ecc

problema reale ora è ottengo FileNotFoundException quando il codice Java tenta di aprire un file dico Abc.txt quando esiste solo abc.txt. : (

Non posso continuare a cambiare tutti i nomi dei file in minuscolo o maiuscolo come ho un sacco di file. Senza cambiare codice molto è che ogni modo possibile per evitare questo?

È stato utile?

Soluzione

Non c'è modo di evitare questo come l'API java.io.File è dipendente dal sistema. Devi usare il caso a destra quando la manipolazione di file su Linux / Unix. In realtà, il mio consiglio / soluzione sarebbe quella di seguire le convenzioni rigide e portatili durante lo sviluppo su Windows (ad esempio, utilizzare lettere minuscole nomi di file solo o, meglio, utilizzare il nome esatto del file durante l'accesso a livello di codice ). Per essere onesti, non capisco il motivo per cui si sta tentando di caricare Abc.txt quando il nome del file è abc.txt. Questa è una cattiva abitudine (insegnata da spendere troppo tempo su Windows), piuttosto che un problema di Linux / Unix.

Altri suggerimenti

risolvere il problema!

Qualsiasi schema si meditano di aggirare fissa sarà peggio nel lungo periodo.

Bene, prima di tutto penso che dovrebbe prevedere il passaggio ad uno schema di denominazione coerente, piuttosto che usare qualche soluzione alternativa.

In ogni caso, per quanto riguarda lettura in tutti i nomi di file e metterli in una mappa che contiene il nome minuscola come una chiave? È possibile quindi cercare il nome di file corretto dalla mappa .

Ciò consentirebbe anche di rilevare un conflitto, per esempio due file "FileA.txt" e "FILEA.TXT" nella stessa directory che hanno gli stessi minuscole rappresentazioni, nel qual caso si sa che si deve affrontare il problema in un modo completamente diverso (perché si deve sapere che quello che si desidera tenere aperte, ed è ambiguo, e tale soluzione non lo farà allora).

Supponendo che i file sono mescolati caso su Linux, non c'è una risposta semplice a questo.

Il meglio che posso pensare è quello di avere la vostra lista applicazione le directory rilevanti e creare un a struttura dati memoria dei nomi di file effettivi Linux. Poi fare un file di case-insensitive aperta, di dividere il percorso in componenti, cercare l'albero in memoria utilizzando la ricerca case-insensitive, bulid il vero percorso (maiuscole e minuscole), e l'uso che per fare il file aperto.

Il problema di questo è che (e in effetti la vostra applicazione) non può far fronte con il caso in cui si dispone di (diciamo) "foo.txt" E "foo.txt" nella stessa directory di Linux.

Ma la soluzione migliore è quella di modificare l'applicazione in modo che funzioni con percorsi case-sensitive.

Perché non si può cambiare un sacco di file? Se la quantità di file è in realtà l'unica cosa che vi trattiene, quindi è sufficiente scrivere un piccolo script che li rinomina a minuscole.

Non è chiaro dalla tua domanda che cosa sta causando il cambiamento caso dei file. Se tutti i file sono in minuscolo in Linux, mentre sono mescolati caso su Windows, si può solo trasformare il nome del file in minuscolo, in questo modo:

new File(filename.toLowerCase())

C'è una soluzione che ha prestazioni di runtime orribile, ma è molto semplice da implementare:

Sostituire new FileReader(name) con qualcosa di simile

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

Non ho compilato questo codice, può avere errori di battitura e gli insetti. Li lascio a voi per risolvere il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top