다음을 통해 공유


일반 탐색기 개념

Shell 네임스페이스 셸에서 관리하는 파일 시스템 및 기타 개체를 단일 트리 구조 계층 구조로 구성합니다. 개념적으로 파일 시스템의 더 크고 포괄적인 버전입니다.

소개

Shell의 주요 책임 중 하나는 시스템을 구성하는 다양한 개체에 대한 액세스를 관리하고 제공하는 것입니다. 이러한 개체 중 가장 많고 친숙한 것은 컴퓨터 디스크 드라이브에 있는 폴더와 파일입니다. 그러나 Shell은 다수의 비파일 시스템 또는 가상 개체도 관리합니다. 몇 가지 예는 다음과 같습니다.

  • 네트워크 프린터
  • 다른 네트워크 컴퓨터
  • 제어판 애플리케이션
  • 휴지통

일부 가상 개체에는 실제 스토리지가 전혀 포함되지 않습니다. 예를 들어 프린터 개체에는 네트워크 프린터에 대한 링크 컬렉션이 포함되어 있습니다. 휴지통과 같은 다른 가상 개체는 디스크 드라이브에 저장된 데이터를 포함할 수 있지만 일반 파일과 다르게 처리해야 합니다. 예를 들어 가상 개체를 사용하여 데이터베이스에 저장된 데이터를 나타낼 수 있습니다. 네임스페이스의 관점에서 데이터베이스의 다양한 항목은 모두 단일 디스크 파일에 저장되어 있더라도 Windows 탐색기에 별도의 개체로 표시될 수 있습니다.

가상 개체는 원격 컴퓨터에 있을 수도 있습니다. 예를 들어 로밍을 용이하게 하기 위해 사용자의 문서 파일이 서버에 저장될 수 있습니다. 사용자가 여러 데스크톱 PC에서 파일에 액세스할 수 있도록 현재 사용 중인 데스크톱 PC의 내 문서 폴더는 데스크톱 PC의 하드 디스크가 아닌 서버를 가리킵니다. 해당 경로에는 매핑된 네트워크 드라이브 또는 UNC 경로 이름이 포함됩니다.

파일 시스템과 마찬가지로 네임스페이스에는 폴더와 파일이라는 두 가지 기본 형식의 개체가 포함됩니다. 폴더 개체는 트리의 노드입니다. 파일 개체 및 기타 폴더에 대한 컨테이너입니다. 파일 개체는 트리의 나뭇잎입니다. 일반 디스크 파일 또는 프린터 링크와 같은 가상 개체입니다. 파일 시스템에 속하지 않은 폴더를 가상 폴더라고도 합니다.

파일 시스템 폴더와 마찬가지로 가상 폴더의 컬렉션은 일반적으로 시스템마다 다릅니다. 가상 폴더에는 세 가지 클래스가 있습니다.

  • 휴지통과 같은 표준 가상 폴더는 모든 시스템에서 찾을 수 있습니다.
  • 표준 이름 및 기능이 있지만 모든 시스템에는 없을 수 있는 선택적 가상 폴더입니다.
  • 사용자가 설치한 비표준 폴더입니다.

파일 시스템 폴더와 달리 사용자는 새 가상 폴더를 직접 만들 수 없습니다. Microsoft가 아닌 개발자가 만든 소프트웨어만 설치할 수 있습니다. 따라서 가상 폴더 수는 일반적으로 파일 시스템 폴더 수보다 훨씬 적습니다. 가상 폴더를 구현하는 방법에 대한 자세한 내용은 네임스페이스 확장참조하세요.

Windows 탐색기의 탐색기 표시줄에서 네임스페이스가 구조화되는 방식을 시각적으로 표시할 수 있습니다. 예를 들어 Windows 탐색기의 다음 스크린샷은 비교적 간단한 네임스페이스를 보여 줍니다.

셸 네임스페이스스크린샷

네임스페이스 계층 구조의 궁극적인 루트는 바탕 화면입니다. 루트 바로 아래에는 내 컴퓨터 및 휴지통과 같은 여러 가상 폴더가 있습니다.

다양한 디스크 드라이브의 파일 시스템은 더 큰 네임스페이스 계층 구조의 하위 집합으로 볼 수 있습니다. 이러한 파일 시스템의 루트는 내 컴퓨터 폴더의 하위 폴더입니다. 내 컴퓨터에는 매핑된 네트워크 드라이브의 루트도 포함되어 있습니다. 트리의 다른 노드(예: 내 문서)는 가상 폴더입니다.

네임스페이스 개체 식별

네임스페이스 개체를 사용하려면 먼저 네임스페이스 개체를 식별하는 방법이 있어야 합니다. 파일 시스템의 개체에는 MyFile.htm같은 이름이 있을 수 있습니다. 시스템의 다른 위치에 해당 이름을 가진 다른 파일이 있을 수 있으므로 파일 또는 폴더를 고유하게 식별하려면 "C:\MyDocs\MyFile.htm"과 같은 정규화된 경로가 필요합니다. 이 경로는 기본적으로 파일 시스템 루트 C:\에서 파일로 끝나는 경로에 있는 모든 폴더의 순서가 지정된 목록입니다.

네임스페이스의 컨텍스트에서 경로는 여전히 네임스페이스의 파일 시스템 부분에 있는 개체를 식별하는 데 매우 유용합니다. 그러나 가상 개체에는 사용할 수 없습니다. 대신 셸은 네임스페이스 개체와 함께 사용할 수 있는 대체 식별 수단을 제공합니다.

항목 ID

폴더 내에서 각 개체에는 파일 또는 폴더 이름과 동일한 기능인 항목 ID있습니다. 항목 ID는 실제로 SHITEMID 구조입니다.

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

abID 멤버는 개체의 식별자입니다. abID 길이가 정의되지 않았으며 해당 값은 개체가 포함된 폴더에 의해 결정됩니다. 폴더에서 abID 값을 할당하는 방법에 대한 표준 정의는 없으므로 연결된 폴더 개체에만 의미가 있습니다. 애플리케이션은 단순히 특정 폴더의 개체를 식별하는 토큰으로 처리해야 합니다. abID 길이가 다르기 때문에 cb 멤버는 SHITEMID 구조체의 크기를 바이트 단위로 보유합니다.

항목 ID는 표시 용도로는 유용하지 않으므로 개체가 포함된 폴더는 일반적으로 표시 이름을 할당합니다. 폴더의 내용을 표시할 때 Windows 탐색기에서 사용하는 이름입니다. 표시 이름을 처리하는 방법에 대한 자세한 내용은 폴더에서 정보를 가져오기를 참조하세요.

항목 ID 목록

항목 ID는 자체에서 거의 사용되지 않습니다. 일반적으로 파일 시스템 경로와 동일한 용도로 사용되는 항목 ID 목록의 일부입니다. 그러나 경로에 사용되는 문자열 대신 항목 ID 목록은 ITEMIDLIST 구조체입니다. 이 구조체는 하나 이상의 항목 ID의 순서가 지정된 시퀀스로, NULL 2 바이트종료됩니다. 항목 ID 목록의 각 항목 ID는 네임스페이스 개체에 해당합니다. 해당 순서는 파일 시스템 경로와 마찬가지로 네임스페이스의 경로를 정의합니다.

다음 그림에서는 C:\MyDocs\MyFile.htm해당하는 ITEMIDLIST 구조체의 도형 표현을 보여 줍니다. 각 항목 ID의 표시 이름이 위에 표시됩니다. abID 멤버의 다양한 너비는 임의입니다. 이 멤버의 크기가 다를 수 있다는 사실을 보여 줍니다.

pidl

PIDL

Shell API의 경우 네임스페이스 개체는 일반적으로 해당 ITEMIDLIST 구조에 대한 포인터 또는 PIDL(항목 식별자 목록)에 대한 포인터로 식별됩니다. 편의를 위해 PIDL이라는 용어는 일반적으로 이 설명서에서 포인터가 아닌 구조 자체를 참조합니다.

앞의 그림에 표시된 PIDL은 전체PIDL 또는 절대PIDL이라고 합니다. 전체 PIDL은 바탕 화면에서 시작하며 경로에 있는 모든 중간 폴더의 항목 ID를 포함합니다. 개체의 항목 ID 뒤에 종료하는 2바이트 NULL이 이어집니다. 전체 PIDL은 정규화된 경로와 유사하며 셸 네임스페이스의 개체를 고유하게 식별합니다.

전체 PIDL은 자주 사용되지 않습니다. 많은 함수와 메서드는 상대적인 PIDL예상합니다. 상대 PIDL의 루트는 데스크톱이 아닌 폴더입니다. 상대 경로와 마찬가지로 구조를 구성하는 일련의 항목 ID는 두 개체 사이의 네임스페이스의 경로를 정의합니다. 개체를 고유하게 식별하지는 않지만 일반적으로 전체 PIDL보다 작고 여러 가지 용도로 충분합니다.

단일 수준 PIDL 가장 일반적으로 사용되는 상대 PIDL은 개체의 부모 폴더를 기준으로 합니다. 그들은 개체의 항목 ID와 끝나는 NULL을 포함합니다. 다단계 PIDL도 여러 용도로 사용됩니다. 둘 이상의 항목 ID를 포함하며 일반적으로 일련의 하위 폴더를 통해 부모 폴더에서 개체로의 경로를 정의합니다. 단일 수준 PIDL은 여전히 정규화된 PIDL일 수 있습니다. 특히 데스크톱 개체는 데스크톱의 자식이므로 정규화된 PIDL에는 하나의 항목 ID만 포함됩니다.

폴더 ID가져오기에서 설명한 대로 Shell API는 개체의 PIDL을 검색하는 다양한 방법을 제공합니다. 이 함수가 있으면 일반적으로 다른 Shell API 함수 및 메서드를 호출할 때 개체를 식별하는 데만 사용합니다. 이 컨텍스트에서 PIDL의 내부 콘텐츠는 불투명하고 관련이 없습니다. 이 논의의 목적을 위해 PIDL을 특정 네임스페이스 개체를 나타내는 토큰으로 생각하고 일반적인 작업에 사용하는 방법에 초점을 맞춥니다.

PIDL 할당

PIDL은 경로와 약간 유사하지만 이를 사용하려면 다소 다른 접근 방식이 필요합니다. 주요 차이점은 메모리를 할당하고 할당 취소하는 방법입니다.

경로에 사용되는 문자열과 마찬가지로 PIDL에 메모리를 할당해야 합니다. 애플리케이션이 PIDL을 만드는 경우 ITEMIDLIST 구조에 충분한 메모리를 할당해야 합니다. 여기서 설명하는 대부분의 경우 Shell은 PIDL을 만들고 메모리 할당을 처리합니다. PIDL을 할당한 대상에 관계없이 애플리케이션은 일반적으로 더 이상 필요하지 않을 때 PIDL의 할당을 취소해야 합니다.

CoTaskMemAlloc 함수를 사용하여 PIDL을 할당하고 CoTaskMemFree 함수를 사용하여 할당을 취소합니다.