пятница, 24 сентября 2010 г.

1.2: Типы файлов

Это перевод File Types. Цикл: реализация индивидуального формата файлов.

Файлы с разделяемым общим расширением (.doc, .html и так далее) являются файлами одного типа. Когда вы распространяете приложение, которое использует файлы, вы можете использовать существующие, хорошо определённые типы файлов. Например, если вы создаёте текстовый редактор, то вы можете использовать существующий тип файла .txt. В других случаях вы можете захотеть создать новый тип файла.

Эта статья организована так:

Тип файла: общедоступный против закрытого

Общедоступный (public) тип файла также известен как популярный или спорный - потому что несколько конкурирующих приложений могут хотеть быть ассоциированны с файлом такого типа. Характеристики сценария с использованием общедоступного типа файлов включают в себя:
  • Они обычно определяются стандартами и/или продвигаются организациями, их определившими, как формат обмена данными.
  • Ими часто обмениваются между машинами и пользователями.
  • Они должны поддерживаться на нескольких платформах.
  • Их могут обрабатывать приложения от нескольких разработчиков.
Некоторые примеры файлов, рассматривающихся общедоступными: файлы изображений .png, .gif, .jpg и .bmp, аудио-файлы .wav, .mp3 и .au.

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

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

Выбор расширения для типа файлов

Ваш тип файлов идентифицируется по своему расширению.

Чтобы определить новый тип файлов:
  1. Выберите длинное расширение файла, которое вы хотите использовать для идентификации типа файла. Подробнее - см. File Type Handlers.
  2. Проверьте базу MIME организации Internet Assigned Numbers Authority (IANA), чтобы определить, не было ли это файловое расширение уже ассоциировано с другим приложением.
  3. Мы рекомендуем, чтобы вы также определили MIME-тип, если вы создаёте новый общедоступный тип файла, и зарегистрировали его в IANA MIME.

Регистрация типа файла

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

Подключ реестра для расширения имени файла должен иметь такую форму: расширение=ProgID. Подключи расширений имён файлов хранятся в HKEY_CLASSES_ROOT.

Важным моментом является указание ведущей точки (.) при создании подключа типа файла в реестре. Например, если вы хотите, чтобы типы файла с коротким расширением .myp и длинным расширением .myp-file открывались в приложении MyProgram, то вы используете такой синтаксис:
HKEY_CLASSES_ROOT 
   .myp 
      (Default) = ApplicationVendor.MyProgram
   .myp-file 
      (Default) = ApplicationVendor.MyProgram
   ApplicationVendor.MyProgram 
      (Default) = MyProgram Application
Как показано в примере выше, если вы также регистрируете короткое расширение файла (.myp), вам также следует создать подключ для длинного расширения (.myp-file). Для дальнейшей информации - см. File Type Handlers.

Установка необязательных подключей и атрибутов расширения файла

Записи расширений типов файлов в реестре имеют несколько опциональных подключей и атрибутов.

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

Запись в реестреДействие
DefaultУстановите значение по-умолчанию в ProgID, с которым ассоциировано расширение.
Content TypeУстановите значение Content Type в тип содержимого MIME этого типа файла.
OpenWithListЭтот подключ содержит одно или несколько приложений, которые появляются в диалоговом окне Открыть с помощью для файлового типа.
OpenWithProgidsЭтот подключ содержит список альтернативных ProgID для этого типа файла. Программы с этими ProgID также появляются в диалоге Открыть с помощью. Когда приложение берёт контроль над типом файла, меняя значение по-умолчанию, оно также должно занести себя в этот список.
PerceivedTypeУстановите значение PerceivedType в имя perceived-типа, которому принадлежит файл. Это значение не используется Windows до Windows Vista. Для дальнейшей информации - см. Perceived Types and Application Registration.
Обычная форма подключа с файловым расширением выглядит так (все записи имеют тип REG_SZ):
HKEY_CLASSES_ROOT 
   .ext 
      (Default) = ProgID.ext.1
      Content Type = MIME content type
      PerceivedType = PerceivedType
      OpenWithList 
         AlternateProgram1.exe 
         AlternateProgram2.exe 
      OpenWithProgids 
         ProgID2.ext.1 
         ProgID3.ext.1 
      ProgID.ext.1 
         shellnew
Важными моментами для рассмотрения при этом являются:
  • Поддерево HKEY_CLASSES_ROOT является отображением, сформированным слиянием HKEY_CURRENT_USER\Software\Classes и HKEY_LOCAL_MACHINE\Software\Classes
  • Обычно HKEY_CLASSES_ROOT предназначен для чтения, а не для записи. Для дальнейшей информации - см. статью HKEY_CLASSES_ROOT.
  • Чтобы зарегистрировать файловый тип глобально на заданной машине, создайте запись для типа файла в HKEY_LOCAL_MACHINE\Software\Classes.
  • Чтобы зарегистрировать файловый тип только для текущего пользователя - создайте запись для типа файла в HKEY_CURRENT_USER\Software\Classes.
  • Приложение может указывать своё собственную реализацию действий (таких как open или play), как показано в следующем примере:
    HKEY_CLASSES_ROOT 
       Applications 
          ApplicationName.exe 
             shell 
                verb
    Подключи ключа действия (verb) включают в себя командную строку и метод drop target: command и DropTarget.
  • Когда вы создаёте или изменяете файловое расширение, вам нужно уведомить систему о произошедшем изменении. Вы можете сделать это вызовом функции SHChangeNotify с указанием события SHCNE_ASSOCCHANGED. Если вы этого не сделаете, то ваше изменение может остаться не замеченным до перезагрузки системы.
  • Чтобы извлечь из реестра информацию о файловых ассоциациях, используйте интерфейс IQueryAssociations. См. File Association Sample Scenario для сценария, который иллюстрирует эту процедуру.
Примечание: оба подключа реестра App Paths и Applications используются для регистрации и контроля поведения системы для приложений. Для дополнительной информации об этой функциональности - см. Регистрация приложений.

Определения атрибутов типа файла

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

Файловые атрибуты являются двоичными флагами, указываемыми как значения REG_DWORD или REG_BINARY в подключе ассоциированного с типом файла ProgID. Чтобы присвоить типу файла атрибуты, добавьте запись EditFlags в ProgID, ассоциированный с типом файла и установите в ней подходящий набор флагов. Флаги могут комбинироваться с помощью логической побитовой операции ИЛИ (OR).
См. FILETYPEATTRIBUTEFLAGS для списка возможных атрибутов типов файлов и их HEX-значений, а также деталей по программной установке и получении этих значений.

Следующий пример показывает установленные атрибуты FTA_NoRemove ($00000010) и FTA_NoNewVerb ($00000020) для типа файла .myp:
HKEY_CLASSES_ROOT 
   .myp-file 
      (Default) = ApplicationVendor.MyProgram
   ApplicationVendor.MyProgram 
      (Default) = MyProgram Application
      EditFlags = 0x00000030

Включение приложения в диалог "Открыть с помощью"

Чтобы убедиться, что приложение добавляется в меню Открыть с помощью для типа файла, добавьте ссылку на приложение либо в OpenWithProgids, либо в OpenWithList для типа файла - как показано в этом примере:
HKEY_CLASSES_ROOT 
   .ext 
      OpenWithList 
         AlternateProgram1.exe 
         AlternateProgram2.exe 
      OpenWithProgids 
         ProgID2.ext.1 
         ProgID3.ext.1
Подключ OpenWithProgids является предпочтительным перед OpenWithList для идентификации приложения. Для дальнейшей информации по этим ключам - см. Установка необязательных подключей и атрибутов расширения файла выше.

Исключение приложения из диалога "Открыть с помощью" для файлов без ассоциаций

Когда пользователь пытается открыть файл, который не является членом любого зарегистрированного типа (т.е. он является файлом неизвестного типа), или когда пользователь выбирает команду Открыть с помощью или Открыть с помощью -> Выбрать программу по-умолчанию из контекстного меню файла, то Оболочка показывает подменю или диалоговое окно, которые позволяют пользователю указать программу, которой нужно открыть этот файл.

По-умолчанию, любое приложение, зарегистрированное в подключе HKEY_CLASSES_ROOT\Applications представлено в этом диалоге Открыть с помощью. Эти приложения представлены в Открыть с помощью вне зависимости от того, зарегистрированы ли они обрабатывать тип файла.

Чтобы предотвратить появление вашего приложения в диалоговом окне Открыть с помощью, когда приложение не должно или не может быть использовано для открытия определённых типов файлов, используйте одну из двух техник:
  1. Добавьте запись NoOpenWith в подключ приложения. Когда приложение использует файловый тип, Windows сохраняет эту информацию, чтобы построить список Рекомендованные программы. Этот список представлен в подменю Открыть с помощью, как показано ниже:

    Снимок экрана с контекстным меню с раскрытым подменю 'Открыть с помощью'
    Снимок экрана с контекстным меню с раскрытым подменю "Открыть с помощью"

    Эти рекомендуемые программы показываются в секции Рекомендуемые приложения диалогового окна Открыть с помощью, как показано тут:

    Снимок экрана диалога 'Открыть с помощью' со списком 'Рекомендованные приложения'
    Снимок экрана диалога "Открыть с помощью" со списком "Рекомендованные приложения"

    Приложения могут отключить это отслеживание, указанием значения NoOpenWith под ключом приложения.

    Примечание: если приложение зарегистрировало себя в списке OpenWithList или OpenWithProgIDs для типа файла, то оно появится в списке Рекомендуемые приложения, даже если оно укажет запись NoOpenWith. Также, не забывайте, что даже если приложение не показывается в списке программ, то пользователь всё равно может выбрать любую программу вручную.

    Запись NoOpenWith - это пустое значение типа REG_SZ, как показано в следующем примере:
    HKEY_CLASSES_ROOT 
       Applications 
          MyProgram.exe 
             NoOpenWith
    Установка NoOpenWith также имеет такие эффекты:
    • Не даёт закрепить файл в Jump-список приложение через drag-and-drop, если только приложение не зарегистрировано для обработки этого типа файла.
    • Не даёт общему файловому диалогу и любому вызову SHAddToRecentDocs добавлять любой файл в Jump-список приложения, если только приложение не зарегистрировано для обработки этого типа файла.
  2. Вторым способом предотвратить появление приложения в диалоговом окне Открыть с помощью является использование подключа SupportedTypes для явного указания списка расширений, которые ваше приложение способно открыть. Это не даёт приложению появляться в диалоговом окне Открыть с помощью для типов файлов, которые оно не может открыть. Это также приводит к показу приложения в списке Рекомендуемые программы, описанного выше, для поддерживаемых им файлов.

    Этот способ особенно полезен, если приложение может сохранять файл определённого типа, но не может его открывать. Приложение должно также установить флаг FOS_DONTADDTORECENT через вызов IFileDialog.SetOptions, когда оно вызывает диалог сохранения файлов. Это не даёт элементу появляться в секциях Недавние или Частые в Jump-списке приложения. Это также блокирует отслеживание приложения для OpenWithList.

    Каждое поддерживаемое расширение добавляется как запись подключа SupportedTypes, как показано в следующем примере. Все записи имеют тип REG_SZ или REG_NULL, без ассоциированных значений.
    HKEY_CLASSES_ROOT 
       Applications 
          ApplicationName 
             SupportedTypes 
                .ext1 
                .ext2 
                .ext3
    Если ключ SupportedTypes задан, то только файлы с этими расширениями могут быть закреплены в Jump-списке приложения или быть отслеживаемыми секциями Недавние или Часто используемые.

    Запись NoOpenWith имеет приоритет над SupportedTypes и скрывает приложения из диалогового окна Открыть с помощью.

Удаление информации из реестра во время удаления приложения

Когда вы удаляете приложение, ProgID и большинство другой информации в реестра, ассоциированной с приложением, должны быть удалены во время удаления приложения. Однако, приложения, которые взяли владение над файловым типом (указанием значения по-умолчанию в ключе типа файла HKEY_CLASSES_ROOT\.extension на ProgID приложения), не должны пытаться удалить это значение во время удаления. Оставление данных на своём месте для значения по-умолчанию позволяет избежать сложностей определения, не перезаписало ли это значение другое приложение, после установки данного приложения. Windows учитывает значение по-умолчанию только, если указанный в нём ProgID зарегистрирован. Если же ProgID не зарегистрирован, то значение игнорируется, как будто его и не было.

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

Следующий пример показывает состояние реестра до удаления приложения:
HKEY_CLASSES_ROOT 
   .mp3 
      (Default) = YourProgID
   YourProgID 
      shell 
         open 
            command 
               (Default) = yourapp.exe %1
А пример ниже - состояние этого же реестра после удаления приложения:
HKEY_CLASSES_ROOT 
   .mp3 
      (Default) = YourProgID
   Подключ YourProgID был удалён

Файловые типы, которые поддерживают открытые мета-данные

В Windows 7 и выше следующие файловые типы поддерживают открытые мета-данные.

Тип файлаРасширение файлов
Office 2007 Documents.docx, .xlsx, .pptx
Office 97-2003 Documents.doc, .xls, .ppt
Saved Search.search-ms
Форматы Windows Media (контейнер Advanced Streaming Format (ASF)).wmv, .wma
MP4 (обработчик свойств).mp4, .m4a, .m4v, .mp4v, .m4p, .m4b, .3gp, .3gpp, .3gp2, .mov

Связанные темы

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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

Примечание. Отправлять комментарии могут только участники этого блога.