C ++ - разделение имени файла и расширения файла - PullRequest
4 голосов
/ 30 ноября 2010

Хорошо, во-первых, я не хочу использовать Boost или какие-либо внешние библиотеки. Я просто хочу использовать C ++ Standard Library . Я могу легко разбить строки с помощью заданного разделителя с помощью моей функции split():

void split(std::string &string, std::vector<std::string> &tokens, const char &delim) {
    std::string ea;
    std::stringstream stream(string);
    while(getline(stream, ea, delim))
        tokens.push_back(ea);
}

Я делаю это с именами файлов. Но есть проблема. Существуют файлы с такими расширениями, как: tar.gz, tar.bz2 и т. Д. Также есть некоторые имена файлов с дополнительными точками. Some.file.name.tar.gz. Я хочу разделить Some.file.name и tar.gz Примечание: Количество точек в имени файла не является постоянным.

Я тоже пытался PathFindExtension, но не повезло. Это возможно? Если так, пожалуйста, просветите меня. Спасибо.

Редактировать: Мне очень жаль, что я не указал ОС. Это Windows.

Ответы [ 5 ]

6 голосов
/ 30 ноября 2010

Я думаю, вы могли бы использовать std::string find_last_of, чтобы получить индекс последнего ., и substr, чтобы вырезать строку (хотя "сложный"«Расширения», включающие несколько точек, потребует дополнительной работы).

5 голосов
/ 30 ноября 2010

Не существует способа делать то, что вы хотите, не требующего базы данных расширений для вашей цели.В расширениях нет ничего волшебного, они просто являются частью имени файла (если вы gunzip foo.tar.gz, скорее всего, получите foo.tar, поэтому для этого приложения .gz фактически является «расширением»).Итак, чтобы сделать то, что вы хотите, создайте базу данных расширений, которые вы хотите искать, и используйте «последнюю точку», если вы ее не найдете.

2 голосов
/ 30 ноября 2010

В стандартной библиотеке C ++ ничего нет, то есть в стандарте нет, но каждая известная мне операционная система предоставляет эту функциональность различными способами.

В Windows вы можете использовать_splitpath (), а в Linux вы можете использовать dirname () & basename ()

0 голосов
/ 30 ноября 2010

Вы можете создать справочную таблицу расширений файлов, с которыми, по вашему мнению, вы можете столкнуться. А также добавьте параметр командной строки, чтобы добавить новый в таблицу поиска, если вы столкнетесь с чем-то новым. Затем проанализируйте имя файла, чтобы увидеть, является ли оно какой-либо записью в таблице поиска подстрокой в ​​имени файла.

РЕДАКТИРОВАТЬ: Вы также можете обратиться к этому вопросу: C ++ / STL строка: Как имитировать регулярные выражения, как функция с подстановочными знаками?

0 голосов
/ 30 ноября 2010

Проблема действительно заключается в именах файлов, подобных *.tar.gz, которые не могут быть последовательно разделены из-за того, что (по крайней мере в Windows) часть .tar не является частью расширения. Вы должны будете либо сохранить список для этих особых случаев и использовать одну точку string::rfind для остальных, либо найти какой-либо заранее реализованный способ. Обратите внимание, что расширения .tar.* не бесконечны и очень стандартизированы (я думаю, их десять).

...