Как избежать исключения FileNotFound когда рабочий Java на Linux из-за чувствительности случая?

Пакет Гибкости HTML

Это - гибкий синтаксический анализатор HTML, который создает чтение-запись DOM и поддерживает плоскость XPath или XSLT (Вы на самом деле не должны понимать XPath, ни XSLT для использования его, не волнуйтесь...). Это - библиотека кода.NET, которая позволяет Вам анализировать "из веб-" файлов HTML. Синтаксический анализатор очень терпим с "реальным миром" уродливый HTML. Объектная модель очень похожа на то, что предлагает System.Xml, но для документов HTML (или потоки).

5
задан Joachim Sauer 14 November 2009 в 10:09
поделиться

7 ответов

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

3
ответ дан 13 December 2019 в 19:29
поделиться

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

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

Это также позволит вам обнаружить конфликт, например, два файла «FileA.txt» и «FILEA.TXT» в одном каталоге, которые имеют одинаковые представления в нижнем регистре,

2
ответ дан 13 December 2019 в 19:29
поделиться

Исправьте!

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

4
ответ дан 13 December 2019 в 19:29
поделиться

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

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

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

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

1
ответ дан 13 December 2019 в 19:29
поделиться

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

1
ответ дан 13 December 2019 в 19:29
поделиться

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

new File(filename.toLowerCase())
0
ответ дан 13 December 2019 в 19:29
поделиться

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

Замените 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
ответ дан 13 December 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: