Introduzione allo spazio dei nomi shell

Lo spazio dei nomi Shell organizza il file system e altri oggetti gestiti da Shell in una singola gerarchia strutturata ad albero. Concettualmente, è una versione più grande e più inclusiva del file system.

Introduzione

Una delle principali responsabilità di Shell è la gestione e l'accesso all'ampia varietà di oggetti che costituiscono il sistema. I più numerosi e familiari di questi oggetti sono le cartelle e i file che risiedono nelle unità disco del computer. Tuttavia, Shell gestisce anche un numero di oggetti virtuali o non file. Di seguito sono riportati alcuni esempi:

  • Stampanti di rete
  • Altri computer con rete
  • applicazioni Pannello di controllo
  • Cestino

Alcuni oggetti virtuali non comportano l'archiviazione fisica. L'oggetto stampante, ad esempio, contiene una raccolta di collegamenti alle stampanti di rete. Altri oggetti virtuali, ad esempio il Cestino, possono contenere dati archiviati in un'unità disco, ma devono essere gestiti in modo diverso rispetto ai normali file. Ad esempio, un oggetto virtuale può essere usato per rappresentare i dati archiviati in un database. In termini di spazio dei nomi, i vari elementi del database potrebbero essere visualizzati in Esplora risorse come oggetti separati, anche se tutti sono archiviati in un singolo file di disco.

Gli oggetti virtuali possono anche trovarsi nei computer remoti. Ad esempio, per facilitare il roaming, i file di documento di un utente potrebbero essere archiviati in un server. Per concedere agli utenti l'accesso ai file da più PC desktop, la cartella Documenti personali nel PC desktop che attualmente usano punta al server, non al disco rigido del PC desktop. Il percorso includerà un'unità di rete mappata o un nome del percorso UNC.

Come il file system, lo spazio dei nomi include due tipi di base di oggetto: cartelle e file. Gli oggetti cartella sono i nodi dell'albero; sono contenitori per oggetti file e altre cartelle. Gli oggetti file sono le foglie dell'albero; sono file di disco normali o oggetti virtuali, ad esempio collegamenti alla stampante. Le cartelle che non fanno parte del file system vengono talvolta definite cartelle virtuali.

Come le cartelle del file system, la raccolta di cartelle virtuali varia in genere dal sistema al sistema. Esistono tre classi di cartelle virtuali:

  • Cartelle virtuali standard, ad esempio il Cestino, disponibili in tutti i sistemi.
  • Cartelle virtuali facoltative con nomi e funzionalità standard, ma potrebbero non essere presenti in tutti i sistemi.
  • Cartelle non standard installate dall'utente.

A differenza delle cartelle del file system, gli utenti non possono creare nuove cartelle virtuali. Possono installare solo quelli creati dagli sviluppatori non Microsoft. Il numero di cartelle virtuali è in genere molto meno del numero di cartelle del file system. Per una discussione su come implementare cartelle virtuali, vedere Estensioni dello spazio dei nomi.

È possibile visualizzare una rappresentazione visiva del modo in cui lo spazio dei nomi è strutturato nella barra di Esplora risorse di Esplora risorse. Ad esempio, la schermata seguente di Esplora risorse mostra uno spazio dei nomi relativamente semplice.

visualizzazione dello spazio dei nomi della shell

La radice finale della gerarchia dello spazio dei nomi è il desktop. Immediatamente sotto la radice sono diverse cartelle virtuali, ad esempio Il computer personale e il Cestino.

I file system delle varie unità disco possono essere visualizzati sottoinsieme della gerarchia dello spazio dei nomi più grande. Le radici di questi file system sono sottocartelle della cartella My Computer. Il computer include anche le radici di qualsiasi unità di rete mappata. Altri nodi nell'albero, ad esempio Documenti personali, sono cartelle virtuali.

Identificazione degli oggetti dello spazio dei nomi

Prima di poter usare un oggetto dello spazio dei nomi, è necessario prima di tutto avere un modo per identificarlo. Un oggetto nel file system potrebbe avere un nome, ad esempio MyFile.htm. Poiché potrebbero essere presenti altri file con tale nome altrove nel sistema, identificare in modo univoco un file o una cartella richiede un percorso completo, ad esempio "C:\MyDocs\MyFile.htm". Questo percorso è fondamentalmente un elenco ordinato di tutte le cartelle in un percorso dalla radice del file system, C:\, che termina con il file.

Nel contesto dello spazio dei nomi, i percorsi sono ancora molto utili per identificare gli oggetti che si trovano nella parte del file system dello spazio dei nomi. Tuttavia, non possono essere usati per gli oggetti virtuali. Invece, Shell fornisce un mezzo alternativo di identificazione che può essere usato con qualsiasi oggetto dello spazio dei nomi.

ID elemento

All'interno di una cartella, ogni oggetto ha un ID elemento, ovvero l'equivalente funzionale di un file o di un nome di cartella. L'ID elemento è in realtà una struttura SHITEMID :

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

Il membro abID è l'identificatore dell'oggetto. La lunghezza di abID non è definita e il relativo valore viene determinato dalla cartella che contiene l'oggetto . Poiché non esiste una definizione standard per il modo in cui i valori abID vengono assegnati dalle cartelle, sono significativi solo per l'oggetto cartella associato. Le applicazioni devono semplicemente considerarle come token che identificano un oggetto in una determinata cartella. Poiché la lunghezza di abID varia, il membro cb contiene le dimensioni della struttura SHITEMID , in byte.

Poiché gli ID elemento non sono utili per scopi di visualizzazione, la cartella che contiene l'oggetto normalmente assegna un nome visualizzato. Questo è il nome utilizzato da Esplora risorse quando visualizza il contenuto di una cartella. Per altre informazioni sul modo in cui vengono gestiti i nomi visualizzati, vedere Recupero di informazioni da una cartella.

Elenchi ID elemento

L'ID elemento viene usato raramente da se stesso. Normalmente, fa parte di un elenco ID elemento, che funge dallo stesso scopo di un percorso del file system. Tuttavia, anziché la stringa di caratteri utilizzata per i percorsi, un elenco ID elemento è una struttura ITEMIDLIST . Questa struttura è una sequenza ordinata di uno o più ID elemento, terminati da un valore NULL a due byte. Ogni ID elemento nell'elenco ID elemento corrisponde a un oggetto dello spazio dei nomi. L'ordine definisce un percorso nello spazio dei nomi, molto simile a un percorso del file system.

Nella figura seguente viene illustrata una rappresentazione schematica della struttura ITEMIDLIST corrispondente alla C:\MyDocs\MyFile.htm. Il nome visualizzato di ogni ID elemento viene visualizzato sopra di esso. Le diverse larghezze dei membri abID sono arbitrarie; illustrano il fatto che le dimensioni di questo membro possono variare.

un'illustrazione schema di un pidl

PIDLs

Per l'API Shell, gli oggetti dello spazio dei nomi vengono in genere identificati da un puntatore alla struttura ITEMIDLIST o al puntatore a un elenco di identificatori di elemento (PIDL). Per praticità, il termine PIDL farà in genere riferimento a questa documentazione alla struttura stessa anziché al puntatore.

Il PIDL illustrato nella figura precedente viene definito completo, o assoluto, PIDL. Un PIDL completo inizia dal desktop e contiene gli ID elemento di tutte le cartelle intermedie nel percorso. Termina con l'ID elemento dell'oggetto seguito da un valore NULL terminante a due byte. Un PIDL completo è simile a un percorso completo e identifica in modo univoco l'oggetto nello spazio dei nomi shell.

I PID completi vengono usati raramente. Molte funzioni e metodi prevedono un PIDL relativo. La radice di un PIDL relativo è una cartella, non il desktop. Come per i percorsi relativi, la serie di ID elemento che costituiscono la struttura definiscono un percorso nello spazio dei nomi tra due oggetti. Anche se non identificano in modo univoco l'oggetto, in genere sono più piccoli di un PIDL completo e sufficienti per molti scopi.

I PIDL relativi più comunemente usati, i PIDL a livello singolo, sono relativi alla cartella padre dell'oggetto. Contengono solo l'ID elemento dell'oggetto e un valore NULL terminante. I PID A più livelli vengono usati anche per molti scopi. Contengono due o più ID elemento e in genere definiscono un percorso da una cartella padre a un oggetto tramite una serie di una o più sottocartelle. Si noti che un PIDL a livello singolo può comunque essere un PIDL completo. In particolare, gli oggetti desktop sono elementi figlio del desktop, quindi i loro PID completi contengono solo un ID elemento.

Come illustrato in Recupero dell'ID di una cartella, l'API shell offre diversi modi per recuperare il PIDL di un oggetto. Dopo averlo creato, in genere viene usato solo per identificare l'oggetto quando si chiamano altre funzioni e metodi dell'API shell. In questo contesto, il contenuto interno di un FILE PIDL è opaco e irrilevante. Ai fini di questa discussione, considerare i PIDL come token che rappresentano oggetti dello spazio dei nomi specifici e concentrarsi su come usarli per le attività comuni.

Allocazione di PIDLs

Anche se i PIDL hanno una certa somiglianza con i percorsi, l'uso richiede un approccio leggermente diverso. La differenza principale consiste nell'allocare e deallocare la memoria per tali risorse.

Analogamente alla stringa usata per un percorso, la memoria deve essere allocata per un FILE PIDL. Se un'applicazione crea un FILE PIDL, deve allocare memoria sufficiente per la struttura ITEMIDLIST . Per la maggior parte dei casi descritti qui, Shell crea il FILE PIDL e gestisce l'allocazione di memoria. Indipendentemente da quanto allocato, l'applicazione è in genere responsabile della deallocazione del FILE PIDL quando non è più necessaria.

Usare la funzione CoTaskMemAlloc per allocare il PIDL e la funzione CoTaskMemFree per deallocarla.