Поделиться через


Общие понятия Обозреватель

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

Введение

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

  • Сетевые принтеры
  • Другие сетевые компьютеры
  • приложения панель управления
  • Корзина

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

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

Как и в файловой системе, пространство имен включает два основных типа объектов: папки и файлы. Объекты папок являются узлами дерева; они являются контейнерами для файловых объектов и других папок. Объекты файлов являются листьями дерева; Это либо обычные файлы дисков, либо виртуальные объекты, такие как ссылки принтера. Папки, которые не являются частью файловой системы, иногда называются виртуальными папками.

Как и в случае с папками файловой системы, коллекция виртуальных папок обычно зависит от системы. Существует три класса виртуальных папок:

  • Стандартные виртуальные папки, такие как корзина, которые находятся во всех системах.
  • Необязательные виртуальные папки, которые имеют стандартные имена и функции, но могут присутствовать не во всех системах.
  • Нестандартные папки, установленные пользователем.

В отличие от папок файловой системы, пользователи не могут самостоятельно создавать новые виртуальные папки. Они могут устанавливать только те, которые были созданы сторонними разработчиками. Таким образом, количество виртуальных папок обычно гораздо меньше, чем количество папок файловой системы. Описание реализации виртуальных папок см. в разделе Расширения пространства имен.

Визуальное представление структуры пространства имен можно увидеть на панели Обозреватель Обозреватель Windows. Например, на следующем снимке экрана Windows Обозреватель показано относительно простое пространство имен.

Снимок экрана: представление пространства имен оболочки

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

Файловые системы различных дисков можно рассматривать как подмножества более крупной иерархии пространства имен. Корни этих файловых систем являются вложенными папками папки "Мой компьютер". Мой компьютер также содержит корни всех сопоставленных сетевых дисков. Другие узлы в дереве, например Мои документы, являются виртуальными папками.

Определение объектов пространства имен

Прежде чем использовать объект пространства имен, необходимо иметь способ его идентификации. Объект в файловой системе может иметь имя, например MyFile.htm. Так как в системе могут быть и другие файлы с таким именем, для уникальной идентификации файла или папки требуется полный путь, например "C:\MyDocs\MyFile.htm". По сути, этот путь представляет собой упорядоченный список всех папок в пути от корневого каталога файловой системы C:\, заканчивая файлом .

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

Идентификаторы элементов

В папке каждый объект имеет идентификатор элемента, который является функциональным эквивалентом имени файла или папки. Идентификатор элемента фактически является структурой SHITEMID :

typedef struct _SHITEMID { 
    USHORT cb; 
    BYTE   abID[1]; 
} SHITEMID, * LPSHITEMID;

Член abID является идентификатором объекта. Длина abID не определена, а ее значение определяется папкой, содержащей объект . Так как нет стандартного определения того, как значения abID назначаются папками, они имеют смысл только для связанного объекта folder. Приложения должны просто рассматривать их как маркер, который идентифицирует объект в определенной папке. Так как длина abID меняется, член cb содержит размер структуры SHITEMID в байтах.

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

Списки идентификаторов элементов

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

На следующем рисунке показано схематическое представление структуры ITEMIDLIST , соответствующей C:\MyDocs\MyFile.htm. Над ним отображается отображаемое имя каждого элемента. Переменная ширина элементов abID является произвольной; они иллюстрируют тот факт, что размер этого элемента может отличаться.

схематическая иллюстрация pidl

PIDLs

Для API оболочки объекты пространства имен обычно идентифицируются указателем на их структуру ITEMIDLIST или указателем на список идентификаторов элементов (PIDL). Для удобства термин PIDL обычно ссылается в этой документации на саму структуру, а не на указатель на нее.

PiDL, показанный на предыдущем рисунке, называется полным или абсолютным PIDL. Полный PIDL начинается с рабочего стола и содержит идентификаторы элементов всех промежуточных папок в пути. Он заканчивается идентификатором элемента объекта, за которым следует завершающий двухбайтовый null. Полный PIDL похож на полный путь и однозначно определяет объект в пространстве имен оболочки.

Полные ПИН-коды используются редко. Многие функции и методы ожидают относительный PIDL. Корнем относительного PIDL является папка, а не рабочий стол. Как и в случае с относительными путями, ряд идентификаторов элементов, составляющих структуру, определяет путь в пространстве имен между двумя объектами. Хотя они не однозначно идентифицируют объект, они обычно меньше полного PIDL и достаточны для многих целей.

Наиболее часто используемые относительные PIDLs ( одноуровневые) относятся к родительской папке объекта. Они содержат только идентификатор элемента объекта и завершающее значение NULL. Многоуровневые PID-файлы также используются для многих целей. Они содержат два или более идентификатора элементов и обычно определяют путь от родительской папки к объекту через последовательность из одной или нескольких вложенных папок. Обратите внимание, что одноуровневый PIDL по-прежнему может быть полным PIDL. В частности, объекты рабочего стола являются дочерними элементами рабочего стола, поэтому их полные PID-коды содержат только один идентификатор элемента.

Как описано в разделе Получение идентификатора папки, API оболочки предоставляет несколько способов получения PIDL объекта. Как правило, вы просто используете его для идентификации объекта при вызове других функций и методов API оболочки. В этом контексте внутреннее содержимое PIDL непрозрачно и не имеет значения. Для целей этого обсуждения думайте о PIDL как о маркерах, представляющих определенные объекты пространства имен, и сосредоточьтесь на том, как использовать их для общих задач.

Выделение ПИН-кодов

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

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

Используйте функцию CoTaskMemAlloc для выделения PIDL и функцию CoTaskMemFree , чтобы освободить ее.