Введение

Суффикс имени файла, указывающий на тип файла.

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

Поддержка операционной системы и файловой системы

Файловая система Multics хранит имя файла как единую строку, не разделяя его на имя и расширение, что позволяет использовать точку (".") как обычный символ в имени файла. Она поддерживает имена файлов переменной длины, допускает наличие нескольких точек, а значит, и нескольких суффиксов, а также отсутствие точки, то есть отсутствие суффикса. Некоторые компоненты Multics и приложения, работающие в этой среде, используют суффиксы для обозначения типов файлов, но наличие суффикса не является обязательным для всех файлов — например, исполняемые файлы и обычные текстовые файлы обычно не имеют суффиксов в своих именах. Файловые системы операционных систем, подобных UNIX, также хранят имя файла как единую строку, где точка (".") является обычным символом. Файл с несколькими суффиксами иногда называют файлом с несколькими расширениями, хотя терминология в этом отношении может различаться, и большинство авторов определяют расширение как часть имени файла, не допускающую наличия нескольких расширений. Несколько расширений обычно указывают на вложенные преобразования, например, файлы `tar.gz` (где `tar` указывает, что файл является архивом tar, содержащим один или несколько файлов, а `gz` указывает, что архив tar сжат с помощью gzip). Программы, преобразующие или создающие файлы, могут добавлять соответствующие расширения к именам, полученным из имен входных файлов (если не указано имя выходного файла), но программы, читающие файлы, обычно игнорируют эту информацию, поскольку она предназначена в основном для пользователя. Чаще всего, особенно в бинарных файлах, информация о содержимом файла хранится во внутренних или внешних метаданных. Такая модель обычно требует указания полного имени файла в командах, в то время как подход с использованием метаданных часто позволяет опустить расширение. В DOS и 16-битной Windows имена файлов ограничены 8 символами, точкой и расширением до трех символов. Файловая система FAT для DOS и Windows хранит имена файлов как 8-символьное имя и 3-символьное расширение. Символ точки при этом не сохраняется. Высокопроизводительная файловая система (HPFS), используемая в ОС/2 от Microsoft и IBM, хранит имя файла как единую строку, где точка (".") является обычным символом. Конвенция использования суффиксов сохранилась, несмотря на то, что HPFS поддерживает расширенные атрибуты файлов, позволяющие хранить тип файла в файле как расширенный атрибут. Собственная файловая система Windows NT от Microsoft, NTFS, и более поздняя ReFS, также хранят имя файла как единую строку; при этом конвенция использования суффиксов для имитации расширений сохранилась для обеспечения совместимости с существующими версиями Windows. В Windows NT 3.5 появилась разновидность файловой системы FAT под названием VFAT, поддерживающая более длинные имена файлов, при этом имя файла рассматривается как единая строка. Windows 95 с VFAT представила поддержку длинных имен файлов и отказалась от разделения имени файла и расширения на 8.3 символа в не-NT Windows. Классическая Mac OS полностью отказалась от метаданных расширений, основанных на имени файла, и вместо этого использовала отдельный код типа файла для идентификации формата файла. Кроме того, использовался код создателя, чтобы определить, какое приложение будет запущено при двойном щелчке по значку файла. macOS, однако, использует суффиксы имен файлов, поскольку она является производной от UNIX-подобной операционной системы NeXTSTEP, в дополнение к использованию кодов типа и создателя. В системах Commodore файлы могут иметь только четыре расширения: PRG, SEQ, USR, REL. Однако они используются для разделения типов данных, используемых программой, и не имеют отношения к идентификации их содержимого. С появлением графических пользовательских интерфейсов возникла проблема управления файлами и поведения интерфейса. Microsoft Windows позволяла ассоциировать несколько приложений с данным расширением, и для выбора нужного приложения были доступны различные действия, например, контекстное меню с возможностью выбора между просмотром, редактированием или печатью файла. При этом предполагалось, что любое расширение представляет собой один тип файла, и между расширением и значком существовало однозначное соответствие. Когда наступила эра Интернета, пользователи Windows, все еще ограниченные форматом имен файлов 8.3, должны были создавать веб-страницы с именами, заканчивающимися на HTM, в то время как пользователи компьютеров Macintosh или UNIX могли использовать рекомендуемое расширение html. Это также стало проблемой для программистов, экспериментировавших с языком программирования Java, поскольку он требует четырехбуквенный суффикс `java` для исходных файлов кода и пятибуквенный суффикс `class` для выходных файлов объектного кода компилятора Java.

Тип содержимого

Расширения имен файлов могут рассматриваться как тип метаданных. Они обычно используются для указания информации о том, как данные могут быть сохранены в файле. Точное определение, определяющее критерии для установления того, какая часть имени файла является его расширением, зависит от правил конкретной используемой файловой системы; как правило, расширение — это подстрока, следующая за последним (если он есть) символом точки (например, txt — это расширение имени файла readme.txt, а html — расширение index.html). В файловых системах некоторых мейнфрейм-систем, таких как CMS в VM, VMS, а также в ПК-системах, таких как CP/M и производных от них системах, таких как MS DOS, расширение является отдельным пространством имен от имени файла. В DOS и Windows от Microsoft расширения, такие как EXE, COM или BAT, указывают на то, что файл является исполняемой программой. В OS/360 и последующих версиях часть имени набора данных, следующая за последней точкой, называемая квалификатором нижнего уровня, рассматривается некоторыми программами, например, TSO EDIT, как расширение, но она не имеет особого значения для самой операционной системы; то же самое относится и к файлам Unix в MVS. Изначально расширение имени файла использовалось для определения общего типа файла. Необходимость сокращения типа файла до трех символов часто приводила к использованию сокращенных расширений. Примеры включают использование GFX для графических файлов, TXT для обычного текста и MUS для музыки. Однако, поскольку было создано множество различных программ, обрабатывающих эти типы данных (и другие) различными способами, расширения имен файлов стали тесно ассоциироваться с определенными продуктами — даже с конкретными версиями продуктов. Например, ранние файлы WordStar использовали WS или WSn, где n — номер версии программы. Также возникли конфликты в использовании некоторых расширений имен файлов. Одним из примеров является rpm, используемый как для пакетов RPM Package Manager, так и для медиафайлов RealPlayer. Другие примеры: qif, используемый шрифтами DESQview, финансовыми документами Quicken и изображениями QuickTime; gba, используемый скриптами GrabIt и образами ROM для Game Boy Advance; sb, используемый для SmallBasic и Scratch; и dts, используемый для Dynamix Three Space и DTS.

По сравнению с типом MIME

Во многих интернет-протоколах, таких как HTTP и MIME электронная почта, тип битового потока указывается как тип медиафайла или тип MIME, а не расширение имени файла. Эта информация приводится в текстовой строке, предшествующей потоку данных, например, "Content-Type: text/plain". Отсутствует стандартное соответствие между расширениями имен файлов и типами медиафайлов, что может приводить к разночтениям при интерпретации данных авторами, веб-серверами и клиентским программным обеспечением при передаче файлов через Интернет. Например, автор контента может указать расширение svgz для сжатого файла Scalable Vector Graphics, но веб-сервер, не распознающий это расширение, может не отправить корректный тип контента application/svg+xml и соответствующий заголовок сжатия, из-за чего веб-браузер не сможет правильно интерпретировать и отобразить изображение. BeOS, файловая система BFS которой поддерживает расширенные атрибуты, присваивает файлу тип медиафайла в виде расширенного атрибута. Некоторые графические среды, такие как KDE и GNOME, определяют тип медиафайла, анализируя как суффикс имени файла, так и содержимое файла, подобно команде `file`, используя это как эвристический метод. Они выбирают приложение для запуска при открытии файла, основываясь на этом типе медиафайла, что снижает зависимость от расширений имен файлов. macOS использует как расширения имен файлов, так и типы медиафайлов, а также коды типов файлов для выбора единого идентификатора типа (Uniform Type Identifier), который используется для внутренней идентификации типа файла.

Исполняемые программы

Использование расширения имени файла в имени команды встречается изредка, как правило, как побочный эффект реализации команды в виде скрипта, например, для оболочки Bourne или Python, когда к имени команды добавляется имя интерпретатора – практика, распространенная в системах, полагающихся на ассоциации между расширением имени файла и интерпретатором, но решительно не рекомендуемая в Unix-подобных системах, таких как Linux, Oracle Solaris, BSD-системы и macOS от Apple, где интерпретатор обычно указывается в заголовке скрипта ("shebang"). В системах, основанных на ассоциациях, расширение имени файла обычно сопоставляется с единственным, общесистемным выбором интерпретатора для этого расширения (например, ".py" означает использование Python), и саму команду можно выполнить из командной строки, даже если расширение опущено (при условии соответствующей настройки). Если язык реализации изменяется, изменяется и расширение имени команды, а ОС предоставляет согласованный API, позволяя использовать одну и ту же версию команды без расширения в обоих случаях. Этот метод несколько страдает из-за глобального характера сопоставления ассоциаций, а также из-за недостаточной практики разработчиков избегать расширений при вызове программ, и невозможности для разработчиков принудительно обеспечить такое избегание. Windows – единственная широко распространенная система, продолжающая использовать этот механизм. В системах с директивами интерпретатора, включая практически все версии Unix, расширения имен команд не имеют специального значения и, согласно общепринятой практике, не используются, поскольку основным способом указания интерпретатора для скриптов является запуск их со строки, определяющей используемый интерпретатор (что можно рассматривать как вырожденную форму ресурсной вилки). В таких средах включение расширения в имя команды излишне раскрывает деталь реализации, которая подвергает риску все ссылки на команду из других программ в случае изменения реализации. Например, совершенно нормально, если скрипт оболочки будет переписан на Python или Ruby, а затем на C или C++, и во всех этих случаях имя команды изменилось бы, если бы использовались расширения. Без расширений программа всегда имеет одно и то же имя без расширения, меняется только директива интерпретатора и/или магическое число, а ссылки на программу из других программ остаются действительными.

Вопросы безопасности

По умолчанию, в File Explorer, файловом браузере, поставляемом с Microsoft Windows, расширения имен файлов не отображаются. Злоумышленники пытались распространять компьютерные вирусы и черви, используя имена файлов, сформированные как LOVE LETTER FOR YOU. TXT. vbs. Цель состоит в том, чтобы это выглядело как LOVE LETTER FOR YOU. TXT, безобидный текстовый файл, не предупреждая пользователя о том, что это вредоносная компьютерная программа, в данном случае написанная на VBScript. В ReactOS по умолчанию расширения имен файлов отображаются в ReactOS Explorer. Более поздние версии Windows (начиная с Windows XP Service Pack 2 и Windows Server 2003) включали настраиваемые списки расширений имен файлов, которые считаются "опасными" в определенных "зонах" работы, например, при загрузке из Интернета или получении в виде вложения к электронной почте. Современное антивирусное программное обеспечение также помогает защитить пользователей от подобных атак, когда это возможно. Некоторые вирусы используют сходство между доменным именем верхнего уровня ".com" и расширением имени файла ".COM", рассылая по электронной почте вредоносные исполняемые файлы команд с именами, поверхностно похожими на URL-адреса (например, "myparty.yahoo.com"), в результате чего пользователи, не осознавая этого, переходят по ссылкам в электронных письмах, которые, как им кажется, ведут на веб-сайты, но на самом деле загружают и запускают вредоносные вложения. Имелись случаи создания вредоносных программ, использующих уязвимости в некоторых приложениях Windows, которые могли вызывать переполнение буфера на основе стека при открытии файла с чрезмерно длинным, не обработанным расширением имени файла. Расширение имени файла – это всего лишь маркер, и содержимое файла не обязано ему соответствовать. Это можно использовать для маскировки вредоносного содержимого. Поэтому при попытке идентификации файла с точки зрения безопасности полагаться только на расширение считается опасным, и предпочтительнее проводить надлежащий анализ содержимого файла. Например, в UNIX-подобных системах часто встречаются файлы без расширений, поскольку вместо этого используются команды, такие как `file`, которые считывают заголовок файла для определения его содержимого.