Pregunta

Mi aplicación web se ejecuta en Windows. Me gustaría ejecutar mi aplicación en Linux también. Me parece que han superado la mayor parte de los problemas como separador de ruta, etc.

El problema real es ahora consigo FileNotFoundException cuando el código Java intenta abrir un archivo digo Abc.txt cuando sólo existe abc.txt. : (

No puedo ir en cambiar todos los nombres de archivo en minúsculas o en mayúsculas, ya que tienen una gran cantidad de archivos. Sin cambiar el código mucho es que cualquier forma posible para evitar esto?

¿Fue útil?

Solución

No hay manera de evitar esto como la API java.io.File es dependiente del sistema. Usted tiene que utilizar el caso justo cuando la manipulación de archivos en Linux / Unix. En realidad, mi consejo / solución sería seguir estrictas convenciones y portátiles durante el desarrollo en Windows (por ejemplo, utilizar nombres de archivo en minúsculas solamente o, mejor, utilizar el nombre exacto del archivo cuando se accede a él mediante programación ). Para ser honesto, no entiendo por qué está tratando de cargar Abc.txt cuando el nombre de archivo es abc.txt. Este es un mal hábito (impartido por pasar demasiado tiempo en Windows) en lugar de un problema de Linux / Unix.

Otros consejos

Fix it!

Cualquier esquema que idear para eludir la fijación será peor en el largo plazo.

Bueno, en primer lugar creo que debe considerar mudarse a un esquema de nomenclatura coherente, en lugar de utilizar alguna solución.

De todos modos, ¿qué pasa con lectura de los nombres de archivos y ponerlos en un mapa que contiene el nombre minúscula como una clave? A continuación, puede buscar el nombre de archivo correcto del mapa .

Esto también permitirá detectar un conflicto, por ejemplo, dos archivos "fileA.txt" y "fileA.txt" en el mismo directorio que tienen las mismas representaciones minúsculas, en cuyo caso usted sabe que hay que abordar el problema de una manera completamente diferente (porque hay que saber qué que desea han abierto, y es ambigua, y una solución tal no lo hará a continuación).

Si se asume que los archivos se mezclan caso en Linux, no hay una respuesta simple a este.

Lo mejor que se me ocurre es que su lista de aplicaciones los directorios relevantes y crear una estructura de datos en la memoria de los nombres de archivo reales Linux. Luego de hacer un archivo entre mayúsculas y minúsculas abierta, permite dividir la ruta en componentes, busque el árbol en la memoria mediante la búsqueda sensible a las mayúsculas, tobulid lo real (mayúsculas y minúsculas) ruta de acceso y el uso que haga el archivo abierto.

El problema con esto es que (y de hecho su aplicación) no puede hacer frente con el caso en que tenga (por ejemplo) "foo.txt" Y "foo.txt" en el mismo directorio Linux.

Sin embargo, la mejor solución es cambiar su aplicación para que funcione con los nombres de ruta entre mayúsculas y minúsculas.

¿Por qué no se puede cambiar una gran cantidad de archivos? Si la cantidad de archivos es realmente la única cosa que te detiene, entonces simplemente escribir un pequeño script que cambia el nombre de todos ellos a minúscula.

No es claro por su pregunta qué está causando el cambio caso de los archivos. Si todos los archivos están en minúsculas en Linux, mientras que se mezclan caso en las ventanas, sólo podría transformar el nombre del archivo a minúsculas, así:

new File(filename.toLowerCase())

Hay una solución que tiene un rendimiento de tiempo de ejecución es horrible, pero es muy fácil de implementar:

Reemplazar new FileReader(name) con 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);
}

No he compilado el código, puede tener errores tipográficos y errores. Los dejo a usted para arreglar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top