2013-07-16 4 views
5

Мне нужно извлечь расширения из имен файлов.Получить расширение файла для особых случаев, таких как tar.gz

Я знаю, что это может быть сделано для отдельных расширений, таких как .gz или .tar с помощью filePath.lastIndexOf('.') или с помощью вспомогательных методов, как FilenameUtils.getExtension(filePath) от Apache Commons-IO.

Но, что делать, если у меня есть файл с расширением, например .tar.gz? Как я могу управлять файлами с расширениями, которые содержат . символов?

+4

На самом деле расширение не '.tar.gz'. Расширение - по определению - это '.gz'. Часть '.tar' предназначена только для информационных целей. Если файл закончил с '.test.zip', вы бы рассмотрели расширение' .zip', не так ли? –

+1

и 'commons-io-2.4.jar' в этом случае, чего вы ожидаете? – vels4j

+0

@ThorstenDittmar По-прежнему разумно обрабатывать * .tar.gz разумно, точно так же, как * .tgz, заметьте. – Ingo

ответ

3

Если вы знаете, какие расширения важны, вы можете просто проверить их явно. Вы бы коллекция известных расширений, например:

List<String> EXTS = Arrays.asList("tar.gz", "tgz", "gz", "zip"); 

Вы могли бы получить (первое) длинное расширение соответствия так:

String getExtension(String fileName) { 
    String found = null; 
    for (String ext : EXTS) { 
    if (fileName.endsWith("." + ext)) { 
     if (found == null || found.length() < ext.length()) { 
     found = ext; 
     } 
    } 
    } 
    return found; 
} 

Так вызов getExtension("file.tar.gz") вернется "tar.gz".

Если у вас есть имена в смешанном футляре, возможно, попробуйте изменить проверку на filename.toLowerCase().endsWith("." + ext) внутри цикла.

0

Нашел простой способ. Используйте substring, чтобы получить только имя файла и indexOf вместо lastIndexOf, чтобы получить первый '.' и расширение после него

+2

Итак, что бы ваша программа рассматривала расширение, если я дал вам файл 'program.logs.tar.gz'? –

+0

Согласитесь, это не будет работать для файлов с такими вещами, как номера версий, встроенные в них. – grkvlt

0

Вы можете получить часть имени файла пути, разделить на . и принять окончательные 0, 1 или 2 элемента в массиве в качестве расширения.

Конечно, если .tar.* (gz, bz2 и т. Д.) Является вашим единственным краевым случаем, то может быть прагматично просто создать решение, которое фильтрует имена файлов для .tar. и использовать это как точку, в которой нужно извлечь расширение (чтобы включить часть .tar).

2

Файл может содержать только одно расширение!

Если у вас есть файл test.tar.gz,

  • .gz является расширение и
  • test.tar является Basename!

.tar в этом случае является частью базового поля, а не части расширения!

Если вы хотите, чтобы файл был закодирован как tar и gz, вы должны назвать его .tgz. Использовать .tar.gz - это плохая практика, если вам нужно обрабатывать эти файлы, вы должны сделать обходной путь, например, переименовать файл в test.tgz.

+1

Попробуйте различить: «расширение» - это то, что определяет какое-либо приложение. С точки зрения ОС нет такой вещи, как «расширение». – Ingo

+0

OS pov, hm ... его, возможно, больше сэкономить, чтобы сказать от FS pov. –

Смежные вопросы