Как избежать исключения FileNotFound при запуске Java в Linux из-за чувствительности к регистру? - PullRequest
5 голосов
/ 14 ноября 2009

Мое веб-приложение работает в Windows. Я хотел бы также запустить свое приложение на Linux. Кажется, я преодолел большинство проблем, таких как разделитель путей и т. Д.

Реальная проблема в том, что я получаю FileNotFoundException, когда код Java пытается открыть файл, скажем Abc.txt, когда существует только abc.txt. (

Я не могу изменить все имена файлов на строчные или прописные, так как у меня много файлов. Многое ли можно изменить, не меняя код?

Ответы [ 7 ]

4 голосов
/ 14 ноября 2009

Исправь это!

Любая схема, которую вы разработаете, чтобы обойти ее исправление, в конечном итоге будет хуже.

3 голосов
/ 14 ноября 2009

Этого нельзя избежать, поскольку API java.io.File зависит от системы. Вы должны использовать правильный случай при манипулировании файлами в Linux / Unix. На самом деле, мой совет / решение заключается в том, чтобы следовать строгим и переносимым соглашениям во время разработки под Windows (например, использовать только имена файлов в нижнем регистре или, лучше, использовать точное имя файла при программном доступе к нему ). Если честно, я не понимаю, почему вы пытаетесь загрузить Abc.txt, когда имя файла - abc.txt. Это плохая привычка (учится тратить слишком много времени на Windows), а не проблема Linux / Unix.

2 голосов
/ 14 ноября 2009

Ну, во-первых, я думаю, что следует подумать о переходе на согласованную схему именования, а не использовать какой-то обходной путь.

В любом случае, как насчет чтения всех имен файлов и помещения их в карту , которая содержит строчное имя в качестве ключа? Затем вы можете найти правильное имя файла на карте .

Это также позволит вам обнаружить конфликт, например, два файла "FileA.txt" и "FILEA.TXT" в одном и том же каталоге, которые имеют одинаковые представления в нижнем регистре, и в этом случае вы знаете, что вам нужно решать проблему совершенно другим способом (потому что вы должны знать тот, который вы хотите открыть, и он неоднозначен, и такой обходной путь не сделает этого).

1 голос
/ 14 ноября 2009

Почему вы не можете изменить много файлов? Если количество файлов действительно единственное, что вас сдерживает, просто напишите небольшой скрипт, который переименует их в нижний регистр.

1 голос
/ 14 ноября 2009

Предполагая, что в Linux файлы имеют смешанный регистр, простого ответа на этот вопрос не существует.

Лучшее, что я могу придумать, - это иметь в своем приложении список соответствующих каталогов и создать в памяти структуру данных реальных имен файлов Linux. Затем, чтобы открыть файл без учета регистра, вы разделяете имя пути на компоненты, ищите дерево в памяти с помощью поиска без учета регистра, составляете реальное (с учетом регистра) имя пути и используете THAT, чтобы открыть файл.

Проблема в том, что оно (и, действительно, ваше приложение) не может справиться со случаем, когда у вас есть (скажем) "foo.txt" И "Foo.txt" в одном каталоге Linux.

Но лучшее решение - изменить приложение так, чтобы оно работало с именами путей с учетом регистра.

0 голосов
/ 14 ноября 2009

Существует решение, которое имеет ужасную производительность во время выполнения, но очень простое в реализации:

Заменить new FileReader(name) на что-то вроде

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

Я не скомпилировал этот код, он может содержать опечатки и ошибки. Я оставляю их вам, чтобы починить.

0 голосов
/ 14 ноября 2009

Из вашего вопроса не ясно, что является причиной изменения ваших файлов. Если все ваши файлы строчные в Linux, а в Windows они смешанные, вы можете просто преобразовать имя файла в нижний регистр, например:

new File(filename.toLowerCase())
...