После переименования файлов с помощью Java некоторые из них недоступны в системе linux или через Java - PullRequest
7 голосов
/ 07 мая 2020

У меня проблема с чтением (и, возможно, записью) файлов в системе linux с использованием Java. Мое приложение жаловалось, что не может прочитать некоторые аудиофайлы, и когда я посмотрел в систему, я заметил, что ls -l не удалось и в этих файлах, и что все проблемные файлы были те, которые содержали символы с кавычками и c, например é, файлы без этих символов допустимы.

[root@N1-0247 Georges Bizet- Suites from Carmen & L'arlésienne]# pwd
/mnt/disk1/share/import/all/MusicUnmatched/WAV/Yan Pascal Tortelier/Georges Bizet- Suites from Carmen & L'arlésienne
[root@N1-0247 Georges Bizet- Suites from Carmen & L'arlésienne]# ls -l
ls: cannot access 20 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Farandole.WAV: No such file or directory
ls: cannot access 19 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Minuetto.WAV: No such file or directory
ls: cannot access 18 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Intermezzo.WAV: No such file or directory
ls: cannot access 17 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Pastorale.WAV: No such file or directory
ls: cannot access 16 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Carillon.WAV: No such file or directory
ls: cannot access 15 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Adagietto.WAV: No such file or directory
ls: cannot access 14 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Minuetto.WAV: No such file or directory
ls: cannot access 13 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Prélude.WAV: No such file or directory
ls: cannot access 08 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Chanson Du Toréador (Act II).WAV: No such file or directory
ls: cannot access 07 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Dans Bohème (Gypsy Song, Act II).WAV: No such file or directory
ls: cannot access 05 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Seguédille (Act I).WAV: No such file or directory
ls: cannot access 04 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Habeñera (Act I).WAV: No such file or directory
ls: cannot access 02 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Prélude (Prelude To Act I).WAV: No such file or directory
ls: cannot access 01 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Les Toréadors (Introduction To Act I).WAV: No such file or directory
total 192148
?????????? ? ?    ?           ?            ? 01 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Les Toréadors (Introduction To Act I).WAV
?????????? ? ?    ?           ?            ? 02 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Prélude (Prelude To Act I).WAV
-rw-rw-rw- 1 root root 36681194 Feb 21  2017 03 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- La Grade Montante (Street Urchins' Chorus, Act I).WAV
?????????? ? ?    ?           ?            ? 04 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Habeñera (Act I).WAV
?????????? ? ?    ?           ?            ? 05 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Seguédille (Act I).WAV
-rw-rw-rw- 1 root root 16455464 Feb 21  2017 06 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Les Dragons D'Alcala (Entr'acte, Act II).WAV
?????????? ? ?    ?           ?            ? 07 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Dans Bohème (Gypsy Song, Act II).WAV
?????????? ? ?    ?           ?            ? 08 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Chanson Du Toréador (Act II).WAV
-rw-rw-rw- 1 root root 27743402 Feb 21  2017 09 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Intermezzo (Entr'acte, Act III).WAV
-rw-rw-rw- 1 root root 39886886 Feb 21  2017 10 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Marche Des Contrebandiers (Introduction To Act III).WAV
-rw-rw-rw- 1 root root 52822606 Feb 21  2017 11 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Nocturne (Micaela's Aria, Act III).WAV
-rw-rw-rw- 1 root root 23100378 Feb 21  2017 12 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Argonaise (Entr'acte, Act IV).WAV
?????????? ? ?    ?           ?            ? 13 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Prélude.WAV
?????????? ? ?    ?           ?            ? 14 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Minuetto.WAV
?????????? ? ?    ?           ?            ? 15 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Adagietto.WAV
?????????? ? ?    ?           ?            ? 16 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Carillon.WAV
?????????? ? ?    ?           ?            ? 17 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Pastorale.WAV
?????????? ? ?    ?           ?            ? 18 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Intermezzo.WAV
?????????? ? ?    ?           ?            ? 19 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Minuetto.WAV
?????????? ? ?    ?           ?            ? 20 - L' Arlésienne, suite for orchestra No. 1, from the incidental music- Farandole.WAV

Файловая система - UTF8 Я думаю, по крайней мере, если я установлю

export LANG=en_US.UTF-8

в моем профиле имена файлов отображаются с правильными именами.

Ранее эти файлы были переименованы приложением Java на новое имя, поэтому, хотя сообщалось об ошибке, похоже, что это какая-то проблема с приложением Java, но я не знаю, что именно.

В моем Java стартовом скрипте у меня есть строка

export LC_ALL=en_US.UTF-8

Я не сталкивался с этой проблемой на других linux системах или Windows, MacOS и т.д.

Ответы [ 4 ]

0 голосов
/ 16 мая 2020

Ваша файловая система повреждена - это не проблема уровня приложения, но содержимое вашего физического диска недействительно в соответствии с драйвером файловой системы, который преобразует содержимое физического диска в имена файлов + данные. Вам необходимо проверить, какое устройство представляет вашу файловую систему (команда «mount» показывает, какое устройство смонтировано в какой каталог - вероятно, это что-то вроде /dev/sda1. Вам необходимо повторно смонтировать его как доступное только для чтения (что может быть сложно если это ваша файловая система root) и запустите fsck /dev/sda1 (или другое устройство), чтобы восстановить ее. Нет 100% уверенности в том, что вы сможете вернуть эти файлы.

0 голосов
/ 11 мая 2020

Во-первых, два момента:

1) Тот факт, что вы получаете ошибки с ls, показывает, что проблема связана с именами файлов и файловой системой, а не с Java как таковым. Вы столкнетесь с той же проблемой, на каком бы языке ни была написана ваша программа, или даже если бы вы попытались скопировать или переименовать файл непосредственно в командной строке.

2) Проблема не в символе кавычек, так как Об этом свидетельствует тот факт, что символ кавычки появляется в файлах, которые были названы правильно - например:

-rw-rw-rw- 1 root root 52822606 Feb 21  2017 11 - Carmen Suites for orchestra Nos. 1 & 2 (assembled by Ernest Guirard)- Nocturne (Micaela's Aria, Act III).WAV

Итак, проблема связана с символом юникода é.

Это этот символ : https://www.compart.com/en/unicode/U+00E9, поэтому он состоит из нулевого байта, за которым следует E9.

Проблема в том, что файловые системы POSIX, такие как xfs, не допускают нулевых байтов в именах файлов (см. Что такое все недопустимые символы в файловой системе XFS? )

Внимание, вы не можете иметь имена файлов с ЭТИМ символом в ЭТОЙ файловой системе.

Итак, вы должны изменить либо имя файла, либо файловая система.

Например, на этой странице перечислены файловые системы с указанием тех, которые позволяют использовать Unicode в своих именах файлов:

https://en.wikipedia.org/wiki/Filename#Comparison_of_filename_limitations

(в виде в сторону, в этот список - Apple HFS +, но интересно отметить, что он был заменен файловой системой Apple APFS, которая НЕ допускает юникод в именах файлов - https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/APFS_Guide/FAQ/FAQ.html)

Другая альтернатива для изменения ваша программа Java для изменения имени файла, чтобы заменить é на e:

    String safeFilename = filename.replaceAll("é", "e");

или, если хотите:

    String safeFilename = filename.replaceAll( "\u00e9", "e" );
0 голосов
/ 13 мая 2020

Это интересная и сложная головоломка, которую сложно отладить.

Я пытался воспроизвести с java .nio.Файлы с Java 11 в Debian 10 с XFS и bash (как встроенный ls), но не удалось воспроизвести проблему с файлами с именем é.

Пожалуйста, попробуйте перейти к более простому сценарию воспроизведения и более подробной информации, иначе мне просто нужно предположить, что это может быть связано с:

Проблема также в том, что это, кажется, трудно отлаживать, поскольку такие простые инструменты, как strace делают не отображать достаточно информации о байтах имен файлов getdents syscall, чтобы увидеть, что происходит на нижнем уровне API, см .: , что я имею в виду

Возможно, пришло время для другая стратегия? Попробуйте записать только полное название песен в файл плейлиста ? Всегда будут специальные символы, которые в некоторых настройках вызовут проблемы, даже пробелы в сценариях, если вы неосторожны, разделители каталогов (sla sh или backsla sh) et c. (См .: этот связанный вопрос )

0 голосов
/ 10 мая 2020

Попробуйте объявить в себе -Dfile.encoding=UTF-8 java команду запуска.

...