Как получить расширение файла

Обновлено: 06.07.2024

Учитывая строку "filename.conf" , как проверить часть расширения?

Мне нужно кроссплатформенное решение.

Этот вопрос был задан в 2008 году, но если вы пришли сюда сегодня, см. std :: filesystem :: path, который является стандартным (начиная с C ++ 17) и кроссплатформенным. Как указано ниже Рой Дантон и yves.

Вы должны позаботиться о том, чтобы имена файлов состояли из более чем одной точки. пример: c:\.directoryname\file.name.with.too.many.dots.ext не будет правильно обрабатываться strchr или find.

Мне больше всего нравится библиотека файловой системы boost, у которой есть функция расширения (пути)

Имя вашего каталога легко обрабатывается обратным поиском :). По моему личному мнению, буст-решения не следует указывать как ответы на проблемы C ++. Требовать внешней библиотеки для чего-то такого простого кажется немного глупым. @marsh: тем не менее, проблема so simple имеет свои особые случаи, особенно когда речь идет о файловых системах - концепции, для которой почти каждая основная (и не такая серьезная) операционная система имеет свою собственную интерпретацию. Рассмотрим, например, скрытые файлы linux (`/home/oren/.conf ') или случай, упомянутый @Torlack . @ 17 из 26, попытка упомянуть только свое имя пользователя должна высветить проблемы, которые могут возникнуть из-за чрезмерного упрощения того, как люди используют именование в свободной форме;) Тем не менее, решение boost никогда не следует принимать как ответ на вопрос, который не спрашивает, как это сделать с помощью boost. Это заблуждение. . ну, переносимое решение для othervise включает в себя некоторый длинный фрагмент кода, который учитывает кодировку учетных записей имен файлов или / и использует другие библиотеки (я подозреваю, что boost не реализует его с нуля, вместо этого использует другие пакеты или API, где это возможно) . Обратите внимание, что даже получение канонического пути из частичного в качестве задачи - огромная проблема с полдюжиной крайних случаев .

Это слишком простое решение?

Происходит, когда имя файла не имеет расширения, а у предыдущей папки есть. в его имени? Отвечаю на вопрос; который указывает "filename.conf", а не ваш гипотетический. По этой логике вы могли бы просто сказать return "Yes. "; вообще без проверки - это подразумевает, что решение должно работать для других входных данных. В качестве другого примера счетчика файл с именем просто «conf» без расширения также вернет «Да . » с учетом вышеизложенного. std :: filesystem :: path :: extension теперь является частью стандарт, проверьте, например, Рой Дантон ответ ниже.

Лучший способ - не писать код, который это делает, а вызывать существующие методы. В Windows PathFindExtension метод, наверное, самый простой.

Так почему бы вам не написать свой собственный?

Хорошо, возьмем пример strrchr, что произойдет, если вы используете этот метод со следующей строкой «c: \ program files \ AppleGate.Net \ readme»? Является ли ".Net \ readme" расширением? Легко написать что-то, что работает для нескольких примеров, но может быть намного сложнее написать что-то, что работает для всех случаев.

Эта функция (в Windows 7) некорректно обрабатывает "file.i i". Да, это действительно так, обратите внимание на пробел. Он спросил об извлечении расширения из файла, а не полного пути. Кроме того, функция Windows API не будет хорошим ответом. Это абсолютно не ответ, а комментарий. -1 за предоставление решения для конкретной платформы, когда OP запросил переносимое решение. +1 От меня. Этот вопрос является первым, который возникает, когда вы гуглите "mfc get file extension", и ваш самый простой ответ, который работает.

Предполагая, что у вас есть доступ к STL:

Изменить: это кроссплатформенное решение, поскольку вы не упомянули платформу. Если вы специально используете Windows, вы захотите использовать специальные функции Windows, упомянутые другими в потоке.

+1, это простейшее решение, если у вас есть файл в виде строки, а не пути!

Кто-то еще упомянул усиление, но я просто хотел добавить код для этого:

+1, спасибо за размещение фактического фрагмента кода с использованием boost. Не забудьте установить связь с -lboost_filesystem , и вы получите рабочее решение.

В C ++ 17 и его std::filesystem::path::extension (библиотека является преемником boost :: filesystem), вы бы сделали свое утверждение более выразительным, чем использование, например, std::string .

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

Это решение всегда будет возвращать расширение даже для таких строк, как «this.a.b.c.d.e.s.mp3», если оно не может найти расширение, которое вернет «».

Собственно, самый простой способ -

Следует помнить одну вещь: если '.' не существует в имени файла, ext будет NULL .

Это не было бы идеальным решением для скрытых файлов UNIX, начинающихся с точки.

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

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

Некоторые ответы включали метод, который я использовал в первую очередь (поиск последнего «.»), Но я вспомнил, что в Linux скрытые файлы / папки начинаются с «.». Таким образом, если файл скрыт и не имеет расширения, для расширения будет использовано полное имя файла. Чтобы избежать этого, я написал этот фрагмент кода:

Я не тестировал это полностью, но думаю, что это должно сработать.

Использование std :: string find / rfind решает ЭТУ проблему, но если вы много работаете с путями, вам следует взглянуть на boost :: filesystem :: path, поскольку это сделает ваш код намного чище, чем возня с индексами / итераторами необработанных строк.

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

Для строк типа массива char вы можете использовать это:

Может обрабатывать пути к файлам в дополнение к именам файлов. Работает как с C, так и с C ++. И кроссплатформенность.

Вы можете уменьшить количество условий. Используйте strlen(extension) в условии for . Затем, если символы не совпадают, верните false. За пределами цикла for возвращается истина.

Вы можете использовать приведенный выше код в своем приложении на C ++, как показано ниже:

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

Это только Windows (Platform SDK)

Это решение, которое я придумал. Затем я заметил, что это похоже на то, что опубликовал @serengeor.

Он работает с std::string и find_last_of , но основная идея также будет работать, если будет изменена для использования массивов char и strrchr . Он обрабатывает скрытые файлы и дополнительные точки, представляющие текущий каталог. Он не зависит от платформы.

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

В данной статье я расскажу очень простые способы, как можно получить расширение файла средствами PHP. Опишу все подробно. Для начала заносим название файла в переменную:
Далее нам поможет функция Explode с помощью которой разбиваем строку на подстроки.
В качестве разделителя используется символ точки (.), То есть символ разделения названия файла от его расширения.

Последнее что нужно, это взять последний элемент массива. В этом нам поможет функция End:
Вот и все, теперь в переменной $mime содержаться значение расширения файла.

Эту операцию можно осуществлять с помощью функции:
Начиная с версии PHP 5 разработчики PHP усилили требования к коду. В частности, это касается работы функций, принимающих в качестве аргументов - ссылки на переменные, массивы и т.п. Поэтому данная функция может вывести ошибку:
Причина ошибка является в передаче на вход функций, требующих указателя на переменную, результата выполнения другой функции.

В данном случае мы видим как результат работы функции Explode передается непосредственно как параметр в функцию End. Но функция End работает с указателем на массив, а не со значением массива.

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

Таким же способом можно получить расширения файла, но вместо функции End используется функция Array_pop:
Функция Array_pop удаляет элемент в конце массива, то есть не только возвращает последнее значение массива. На одну операцию выполняется более чем с функцией End, но разница настолько маленькая, что на это даже не стоит акцентировать внимание.

Выполнить поиск расширения можно используя вместе функцию Substr и функцию Strrpos:
Чтобы избавиться самой точки в полученном подстроке, увеличиваем начало старта на одно смещение вправо (1).

Существует еще один способ:
Работает следующим образом: функция Strrchr возвращает участок строки, следующей за указанным параметром, после чего Substr отрезает первый символ - точку.

Существует также функция Pathinfo, с помощью которой можно получить расширение файла. По моему мнению, это лучший вариант. Для этого выполняем простой код:
Здесь описаны простые способы получения расширение файла, но помните, это только для ознакомления, или даже для демонстрации возможностей языка PHP. На самом деле, вам самим решать, каким образом использовать для различных случаев возможен особый подход.

Этичный хакинг и тестирование на проникновение, информационная безопасность


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

Если вам кажется, что проблема с определением типов файлов без расширений надуманная, то это далеко не так! Во-первых, если подумать, это не такая уж простая задача. А с файлом без расширения вы можете столкнуть, например, при декодировании строки из Base64 кодировки.

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

1) разбора прошивок (например, роутеров, IP камер) на составные части (первый этап обратной инженерии либо анализа работы устройств для поиска уязвимостей и бэкдоров)

2) поиска файловых систем на дисках и их образах (первый этап криминалистической IT экспертизы)

3) поиска удалённых файлов

Как определить тип данных, если у файла нет расширения

Если у файла нет расширения, то единственным вариантом определения его типа остаётся содержимое этого файла. Можно попробовать добавлять различные расширения к имени файла и пытаться открыть соответствующими для этого расширения программами — этот вариант медленные и неэффективный.

Определённые типы бинарных файлов могут иметь одинаковый набор байтов — по этим байтам можно сопоставить тип файлов. И именно данный метод и применяется программами, предназначенными для определения типа данных. Специфичные байты как правило располагаются не в самом начале файла, поэтому кроме самих байтов, нужно знать смещение от начала, где эти байты должны находиться. Некоторые программы в дополнении к байтам для идентификации ещё имеют список для проверки на ложное срабатывание.

Такие паттерны на английском часто называют magic — это пошло от «magic number» в исполнимых файлах. Эти файлы имеют «магическое число», хранящееся в определённом месте рядом с началом файла, которое сообщает операционной системе UNIX, что файл является двоичным исполняемым файлом и каким именно из нескольких типов. Концепция «магического числа» была применена к другим бинарным файлам. То есть файлы одинакового типа имеют одинаковую последовательность байтов в определённом месте от начала файлов.

Файл с сигнатурами, описывающими какие именно байты, на каком расстоянии от начала файла характерны для файлов того или иного типа, обычно называют magic file.

Кроме магических чисел могут применяться и другие техники, например, программа file для проведения тестов файловых систем также может использовать системный вызов stat. Тип текстовых файлов определяется по содержащимся в них строкам (например, это может быть PHP код, файл в XML или HTML разметке, JSON и так далее).

Команда file — мгновенное определение типа любого файла

В Linux есть команда file с огромной базой сигнатур, которая очень быстро определяет тип файла:

Чтобы узнать, что за файл без расширения, выполните команду вида:


То есть это текстовый файл офисного пакета Microsoft Office.

Можно указать сразу несколько файлов для проверки или использовать подстановочные символы. Например, следующая команда проверит типы всех файлов в текущей папке:


У программы file имеются опции, подробности о них смотрите в отдельной статье «Инструкция по использованию команды file».

Аналог команды file для Windows

file — это утилита командной строки для Linux, поэтому пользователям Windows нужна какая-то альтернатива. Рассмотрим несколько способов использования file в Windows.

1. Утилита file в Cygwin

Данный способ, на мой взгляд, самый простой. Достаточно скачать Cygwin и вы можете пользоваться большинством утилит Linux. Подробности, в том числе как указывать пути в файловой системе, смотрите в ветке «Как начать знакомство с командами Linux: Cygwin».


2. file в WSL

Подсистема Windows для Linux (WSL) это ещё один способ использовать утилиты Linux в Windows. Подробности о работе с WSL смотрите в справочном материале «WSL (подсистема Windows для Linux): подсказки, инструкции, решения проблем».

3. Скомпилированный file для Windows

Файлы различаются архитектурой (64- и 32-битные), а также компилятором.

Распакуйте скаченный архив. Например, я поместил скаченные файлы в папку C:\Users\MiAl\Downloads\file\.

Откройте командную строку, для этого нажмите Win+x, выберите «Windows PowerShell».

Перейдите в папку с программой:

Для определения расширения файла используйте команду вида:


Вы можете проверить сразу много файлов, для этого перейдите в папку с утилитой file и выполните команду вида:

Например, я хочу проверить все файлы в папке Z:\testfiles\, тогда команда следующая:


4. TrID — кроссплатформенная альтернатива file для Windows и Linux

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


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


Установка TrID в Windows

Распакуйте оба файла в одну папку.

Распакуйте скаченный архив. Например, я поместил скаченные файлы в папку C:\Users\MiAl\Downloads\trid\.

Откройте командную строку, для этого нажмите Win+x, выберите «Windows PowerShell».

Перейдите в папку с программой:

Для определения расширения файла используйте команду вида:

Подстановочные знаки могут использоваться для сканирования групп файлов, целых папок и так далее.




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

На этом этапе файлы в папке c:\temp будут выглядеть так:

Вместо предыдущей опции можно использовать -ce, которая изменит расширение файла на новое; если у файла нет расширения, будет добавлено новыъое. Например:

  • IAmASoundFile.dat -> IAmASoundFile.wav
  • IAmABitmap -> IAmABitmap.bmp

TrID может получить список файлов со стандартного ввода с помощью переключателя -@.

Таким образом, можно работать со всем деревом папок или определенным подмножеством файлов, просто используя вывод какой-либо другой команды через конвейер. Что-то вроде:

Можно указать TrID показывать дополнительную информацию о каждом совпадении (например, тип mime, кто создал эту сигнатуру, сколько файлов было просканировано и так далее); а также можно ограничить количество отображаемых результатов.

Ключ -v активирует подробный режим, а -r:nn указывает максимальное количество совпадений, которое будет отображать TrID. По умолчанию 5 для обычного режима, 2 для подробного, 1 для многофайлового анализа.

Программа TrID обновляется нечасто, но база данных регулярно получает новые сигнатуры, поэтому время от времени обновляйте базу данных.

5. fil — ещё одна кроссплатформенная альтернатива file

Программа fil написана на Go и является кроссплатформенной. Но в программе настолько мало сигнатур, что, на мой взгляд, утилита fil практически бесполезна.

Альтернативы file

Для большинства нужд по определению типа файла без расширения достаточно утилиты file, но есть утилиты со смежным функционалам, которые могут заменить или уточнить информацию от file. Более подробно каждая из этих программ будет рассмотрена в следующей части, сейчас только краткий обзор.

Detect It Easy

Detect It Easy — это кроссплатформенная программа для определения типов файлов. Имеется вариант с графическим интерфейсом, а также интерфейсом командной строки.

Анализ файла /mnt/disk_d/Share/testfiles/file1 с показом результатов в графическом интерфейсе:

Анализ файла без расширения, расположенного по пути /mnt/disk_d/Share/testfiles/file1 для определения типа файла:

Detect It Easy в первую очередь нацелена на анализ исполнимых файлов, поэтому её функции в большей степени относятся к файлам программ, например, определение архитектуры. Но также имеется поддержка других бинарных файлов.

Binwalk

Binwalk это программа для анализа прошивок, но в ней собрано много сигнатур бинарных файлов, поэтому она подходит для определения типа файла. Особенность Binwalk в том, что она нацелена на работу с составными файлами (которыми обычно и являются прошивки), поэтому она может определять тип файла даже если файл находится не в начале.

Использование такое же, как и file, достаточно указать путь до одного или нескольких файлов:

Detect It Easy и Binwalk не столько конкуренты утилиты file, сколько «последний шанс» определить тип данных, если команда file не помогла.

В этом уроке я расскажу, что такое расширение и какие бывают типы файлов в Windows. А в конце дам таблицу наиболее популярных форматов с подробным описанием.

Что такое формат и расширение

Формат или тип — это информация о файле, по которой система понимает, какого он вида и в какой программе его открыть. Для этого у каждого файла есть расширение .

Расширение — это несколько английских букв и/или цифр. Находятся они сразу после названия и разделяются точкой.


На картинке показан файл с расширением mp3. Про него компьютер знает, что это аудио и открывать его нужно в программе-проигрывателе. Значок, которым он отмечен – это иконка программы запуска.

Есть текстовые файлы - они открываются в программе для работы с текстом. Есть музыкальные и видео - они запускаются в проигрывателях. Есть графические (фото, картинки) – они открываются в программах для просмотра изображений. И еще много других типов. У каждого из них свой значок, точнее, значок приложения, в котором он будет открыт.


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


При его открытии появится окно с выбором приложения. Компьютер предлагает пользователю самостоятельно указать программу для запуска.


На заметку . В Windows есть разнообразные системные иконки:


Как правило, такими значками отмечены файлы, которые нужны для корректной работы компьютера. Их много в системном локальном диске. Такие объекты нельзя удалять или переименовывать, иначе приложения, за которые они отвечают, могут работать со сбоями.

Как узнать расширение

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


Или наоборот: так, что показаны только имена, без форматов.


Эту настройку можно изменить.

В Windows 10 открыть любую папку, нажать на пункт «Вид» вверху и поставить или убрать птичку с пункта «Расширения имен файлов».


В Windows 7 чуть сложнее:

Или так: Пуск → Панель управления → Оформление и персонализация → Параметры папок.



Если расширения нет

Если у объекта нет расширения, компьютер не может подобрать программу для его запуска. Это происходит, когда пользователь случайно или намеренно удаляет расширение из имени. А еще может быть из-за вируса.


Решить эту проблему легко, если знаешь тип объекта. Например, знаешь, что это фотография. Тогда нужно просто переименовать файл, добавить после названия точку и указать формат. Вот как это сделать:

  1. Настроить компьютер на показ расширений (см. выше).
  2. Правой кнопкой мыши по файлу – Переименовать.
  3. Сразу после названия напечатать точку и расширение.
  4. Нажать Enter.


Наиболее популярные форматы:

  • Документы – doc, docx или pdf
  • Таблицы – xls, xlsx
  • Архивы – zip или rar
  • Фотографии – jpg или png
  • Музыка – mp3 или wav
  • Видео – mp4 или avi

Другие типы можно посмотреть в конце урока в таблице.

Если формат неизвестен . Чтобы открыть файл, необязательно вручную прописывать расширение. Можно просто запустить его и в окошке выбрать подходящую программу. Если вы правильно ее укажите, объект откроется.

Или щелкните по нему правой кнопкой мыши, выберите «Открыть с помощью…». Или «Открыть с помощью» → «Выбрать другое приложение».

Как изменить расширение

Изменить расширение можно через переименование:

  1. Настроить компьютер на показ расширений (см. выше).
  2. Щелкнуть правой кнопкой мыши по файлу – Переименовать.
  3. Стереть старое расширение после точки и напечатать новое.
  4. Нажать Enter.


Появится окошко, в котором система предупредит о последствиях. Ведь если вы неправильно укажите формат, файл может не открыться. Например, у вас документ с расширением doc, а вы меняете его на pdf.


После нажатия на кнопку «Да» новый тип будет назначен. А также добавится значок программы для его запуска. Но обычно после такой ручной смены расширения файл перестает открываться. Потому что он технически остался тем же, что и был.

Вернуть старое расширение можно таким же образом – через переименование. Или щелкнув правой кнопкой мыши по пустому месту и выбрав пункт «Отменить переименование».


Так как же правильно изменить расширение? Для этого нужно сделать конвертацию – преобразование в другой формат. Это делается через специальные программы или онлайн-сервисы.

Вбиваем в поисковик Яндекс или Гугл запрос «из … в …». Например, из word в pdf .


В моем случае Яндекс предложил несколько онлайн сервисов. Все они интуитивно понятны: загружаем документ на сайт → сервис преобразовывает его в pdf → скачиваем результат на компьютер.

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

Как назначить программу запуска

Каждому типу файла система назначает приложение для его запуска. И помечает иконкой этой программы. Например, текстовые (txt) будут по умолчанию открыты в Блокноте. А музыкальные (mp3) – в проигрывателе Windows Media.


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

Если поставить птичку на пункт «Всегда использовать это приложение», то в последующем все объекты данного типа будут запускаться в выбранной программе.


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

Для каждого популярного формата есть своя бесплатная программа:

  • PDF – Foxit Reader (оф.сайт)
  • ZIP и RAR – 7-Zip (оф.сайт)
  • DOC, DOCX, XLS, XLSX и другие документы MS Office – OpenOffice (оф.сайт)
  • MP3, MP4, MKV и другие аудио/видео – Media Player Classic (оф.сайт)

Другие форматы и программы для них смотрите в таблице.

На заметку . Также белый лист вместо значка приложения показывается на файлах, у которых нет расширения. Об этом я рассказывал выше в статье.

Выбор программы по умолчанию

А бывает, объекты определенного типа открываются в неподходящей программе. Тогда можно указать другое приложение для их запуска.

1 . Щелкните правой кнопкой мыши по файлу. Выберите «Открыть с помощью…» или «Открыть с помощью» → «Выбрать другое приложение».


2 . В окошке кликните левой кнопкой мыши по нужной программе и поставьте птичку на пункт «Всегда использовать это приложение». Нажмите ОК.


Вот и всё – теперь объекты данного формата будут по умолчанию запускаться в назначенной программе.

Читайте также: