Gestione del file system

Shell offre diversi modi per gestire i file system. Shell fornisce una funzione , SHFileOperation, che consente a un'applicazione di spostare, copiare, rinominare ed eliminare file a livello di codice. Shell supporta anche alcune funzionalità aggiuntive di gestione dei file.

  • I documenti HTML possono essere connessi a file correlati, ad esempio file grafici o fogli di stile. Quando il documento viene spostato o copiato, i file connessi vengono spostati o copiati automaticamente.
  • Per i sistemi disponibili per più utenti, i file possono essere gestiti in base all'utente. Gli utenti hanno facile accesso ai file di dati, ma non ai file appartenenti ad altri utenti.
  • Se i file di documento vengono aggiunti o modificati, possono essere aggiunti all'elenco dei documenti recenti della shell. Quando l'utente fa clic sul comando Documenti nel menu Start, viene visualizzato un elenco di collegamenti ai documenti.

Questo documento illustra il funzionamento di queste tecnologie di gestione dei file. Viene quindi descritto come usare shell per spostare, copiare, rinominare ed eliminare file e come gestire gli oggetti nel Cestino.

gestione file Per-User

La shell di Windows 2000 consente di associare file a un determinato utente in modo che i file rimangano nascosti ad altri utenti. In termini di file system, i file vengono archiviati nella cartella del profilo dell'utente, in genere C:\Documents and Settings\Username\ nei sistemi Windows 2000. Questa funzionalità consente a molti utenti di usare lo stesso computer, mantenendo al tempo stesso la privacy dei file di altri utenti. Diversi utenti possono avere programmi diversi disponibili. Offre anche un modo semplice per gli amministratori e le applicazioni di archiviare elementi come l'inizializzazione (.ini) o i file di collegamento (lnk). Le applicazioni possono quindi mantenere uno stato diverso per ogni utente e ripristinare facilmente tale stato specifico quando necessario. È disponibile anche una cartella del profilo per l'archiviazione di informazioni comuni a tutti gli utenti.

Poiché è scomodo determinare quale utente è connesso e dove si trovano i file, le cartelle standard per utente sono cartelle speciali e sono identificate da un CSIDL. Ad esempio, il CSIDL per la cartella Programmi per utente è CSIDL_PROGRAMS. Se l'applicazione chiama SHGetFolderLocation o SHGetFolderPath con uno degli ID CSID per utente, la funzione restituisce il puntatore a un elenco di identificatori di elemento (PIDL) o a un percorso appropriato per l'utente attualmente connesso. Se l'applicazione deve recuperare il percorso o PIDL della cartella del profilo, il relativo CSIDL viene CSIDL_PROFILE.

Cartelle Documenti e Immagini personali

Una delle icone standard trovate sul desktop è Documenti personali. Quando si apre questa cartella, contiene i file di documento dell'utente corrente. L'istanza desktop di Documenti è una cartella virtuale, ovvero un alias per il percorso del file system usato per archiviare fisicamente i documenti dell'utente, che si trova immediatamente sotto il desktop nella gerarchia dello spazio dei nomi.

Lo scopo delle cartelle Documenti e Immagini personali è quello di offrire agli utenti un modo semplice e sicuro per accedere ai file di documenti e immagini in un sistema che potrebbe avere più utenti. A ogni utente vengono assegnate cartelle separate del file system per i propri file. Ad esempio, il percorso della cartella documenti di un utente nel file system è in genere simile a C:\Documents and Settings\username\My Documents. Non è necessario che gli utenti sappiano nulla sul percorso fisico delle cartelle del file system. Accedono semplicemente ai file tramite l'icona Documenti personali.

Nota

Documenti personali consente a un utente di accedere ai propri file, ma non a quelli di qualsiasi altro utente. Se più utenti usano lo stesso computer, un amministratore può bloccare gli utenti dalla parte del file system in cui sono archiviati i file effettivi. Gli utenti potranno quindi lavorare sui propri documenti tramite la cartella Documenti, ma non sui documenti che appartengono ad altri utenti.

 

In genere non è necessario che un'applicazione sappia quale utente è connesso o dove si trova la cartella Documenti dell'utente nel file system. L'applicazione può invece recuperare il PIDL dell'icona desktop Documenti chiamando il metodo IShellFolder::P arseDisplayName del desktop. Il nome di analisi usato per identificare la cartella Documenti non è un percorso di file, ma piuttosto ::{450d8fba-ad25-11d0-98a8-0800361b1103}. L'espressione tra parentesi quadre è il formato di testo del GUID Documenti personali. Ad esempio, per recuperare il PIDL dei documenti, l'applicazione deve usare questa chiamata a IShellFolder::P arseDisplayName.

hr = psfDeskTop->ParseDisplayName(NULL, 
                                  NULL, 
                                  L"::{450d8fba-ad25-11d0-98a8-0800361b1103}", 
                                  &chEaten, 
                                  &pidlDocFiles, 
                                  NULL);

Una volta che l'applicazione ha il FILE PIDL Documenti personali, può gestire la cartella esattamente come farebbe una normale cartella del file system, enumerando elementi, analisi, associazione ed eseguendo qualsiasi altra operazione di cartella valida. Shell esegue automaticamente il mapping delle modifiche apportate a Documenti personali o alle relative sottocartelle alle cartelle del file system appropriate.

Se l'applicazione deve accedere alla cartella del file system effettiva che contiene i documenti dell'utente corrente, passare CSIDL_PERSONAL a SHGetFolderLocation. La funzione restituisce il PIDL della cartella del file system visualizzata nella cartella Documenti dell'utente corrente.

File connessi

I documenti HTML hanno spesso diversi file grafici associati, un file di foglio di stile, diversi file microsoft JScript (compatibili con la specifica del linguaggio ECMA 262 ) e così via. Quando si sposta o si copia il documento HTML primario, in genere si desidera spostare o copiare i file associati per evitare l'interruzione dei collegamenti. Purtroppo, fino ad ora non c'è stato modo semplice per determinare quali file sono correlati a qualsiasi documento HTML specificato diverso dall'analisi del relativo contenuto. Per risolvere questo problema, Windows 2000 consente di connettere un documento HTML primario al gruppo di file associati. Se la connessione file è abilitata, quando il documento viene spostato o copiato tutti i relativi file connessi vengono usati.

Per creare un gruppo di file connessi, il documento primario deve avere un .htm o .html estensione del nome file. Creare una sottocartella della cartella padre del documento primario. Il nome della sottocartella deve essere il nome del documento primario, meno l'estensione .htm o .html, seguita da una delle estensioni elencate di seguito. Le estensioni più usate sono ".files" o "_files". Ad esempio, se il documento primario è denominato MyDoc.htm, la denominazione della sottocartella "MyDoc_files" definisce la sottocartella come contenitore per i file connessi del documento. Se il documento primario viene spostato o copiato, la sottocartella e i relativi file vengono spostati o copiati.

Per alcune lingue, è possibile usare un equivalente localizzato di "_files" per creare una sottocartella per i file connessi. Nella tabella seguente sono elencate le stringhe valide che possono essere aggiunte a un nome di documento per creare una sottocartella dei file connessi. Si noti che alcune di queste stringhe hanno '-' come primo carattere anziché '_' o '.'.

"_archivos"

"_arquivos"

"_bestanden"

"_bylos"

"-Dateien"

"_datoteke"

"_dosyalar"

"_elemei"

"_failid"

"_fails"

"_fajlovi"

"_ficheiros"

"_fichiers"

"-filer"

".files"

"_files"

"_file"

"_fitxers"

"_fitxategiak"

"_pliki"

"_soubory"

"_tiedostot"

 

Nota

Questa funzionalità è sensibile alla distinzione tra maiuscole e minuscole dell'estensione. Ad esempio, per l'esempio precedente, una sottocartella denominata "MyDoc_Files" non verrà connessa a MyDoc.htm.

 

Se la connessione file è abilitata o disabilitata è controllata da un valore REG_DWORD , NoFileFolderConnection, della seguente chiave del Registro di sistema.

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer

Questo valore in genere non è definito e la connessione file è abilitata. Se necessario, è possibile disabilitare la connessione file aggiungendo questo valore alla chiave e impostandolo su 1. Per abilitare di nuovo la connessione file, impostare NoFileFolderConnection su zero.

Nota

La connessione file deve essere normalmente abilitata perché altre applicazioni potrebbero dipendere da esso. Disabilitare la connessione file solo se assolutamente necessario.

 

Spostamento, copia, ridenominazione ed eliminazione di file

Lo spazio dei nomi non è statico e le applicazioni in genere devono gestire il file system eseguendo una delle operazioni seguenti.

  • Copia di un oggetto in un'altra cartella.
  • Spostamento di un oggetto in un'altra cartella.
  • Eliminazione di un oggetto.
  • Ridenominazione di un oggetto.

Queste operazioni vengono eseguite con SHFileOperation. Questa funzione accetta uno o più file di origine e produce i file di destinazione corrispondenti. Nel caso dell'operazione di eliminazione, il sistema tenta di inserire i file eliminati nel Cestino.

È anche possibile spostare i file usando la funzionalità di trascinamento della selezione .

Per usare la funzione, è necessario compilare i membri di una struttura SHFILEOPSTRUCT e passarlo a SHFileOperation. I membri chiave della struttura sono pFrom e pTo.

Il membro pFrom è una stringa con terminazione null doppia contenente uno o più nomi di file di origine. Questi nomi possono essere percorsi completi o caratteri jolly DOS standard, ad esempio *.*. Anche se questo membro viene dichiarato come stringa con terminazione null, viene usato come buffer per contenere più nomi di file. Ogni nome di file deve essere terminato dal normale carattere NULL singolo. Un carattere NULL aggiuntivo deve essere aggiunto alla fine del nome finale per indicare la fine di pFrom.

Il membro pTo è una stringa con terminazione null doppia, molto simile a pFrom. Il membro pTo contiene i nomi di uno o più nomi di destinazione completi. Sono racchiusi in pTo nello stesso modo in cui sono per pFrom. Se pTo contiene più nomi, è necessario impostare anche il flag di FOF_MULTIDESTFILES nel membro fFlags . L'utilizzo di pTo dipende dall'operazione, come descritto qui.

  • Per le operazioni di copia e spostamento, se tutti i file verranno visualizzati in una singola directory, pTo contiene il nome della directory completo. Se i file si trovano in destinazioni diverse, pTo può contenere anche una directory o un nome file completo per ogni file di origine. Se una directory non esiste, il sistema lo crea.
  • Per le operazioni di ridenominazione, pTo contiene un percorso completo per ogni file di origine in pFrom.
  • Per le operazioni di eliminazione, pTo non viene usato.

Notifica alla shell

Notificare alla shell della modifica dopo aver usato SHFileOperation per spostare, copiare, rinominare o eliminare file oppure dopo aver eseguito qualsiasi altra azione che influisce sullo spazio dei nomi. Le azioni che devono essere accompagnate dalla notifica includono quanto segue:

  • Aggiunta o eliminazione di file o cartelle.
  • Spostamento, copia o ridenominazione di file o cartelle.
  • Modifica di un'associazione di file.
  • Modifica degli attributi di file.
  • Aggiunta o rimozione di unità o supporti di archiviazione.
  • Creazione o disabilitazione di una cartella condivisa.
  • Modifica dell'elenco di immagini di sistema.

Un'applicazione notifica alla Shell chiamando SHChangeNotify con i dettagli di ciò che è stato modificato. Shell può quindi aggiornare l'immagine dello spazio dei nomi in modo accurato in base al nuovo stato.

Esempio semplice di gestione dei file con SHFileOperation

L'applicazione console di esempio seguente illustra l'uso di SHFileOperation per copiare i file da una directory a un'altra. Le directory di origine e di destinazione, C:\My_Docs e C:\My_Docs2, sono hardcoded nell'applicazione per semplicità.

#include <shlobj.h>
#include <shlwapi.h>
#include <strsafe.h>

int main(void)
{
    IShellFolder *psfDeskTop = NULL;
    IShellFolder *psfDocFiles = NULL;
    LPITEMIDLIST pidlDocFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IEnumIDList *ppenum = NULL;
    SHFILEOPSTRUCT sfo;
    STRRET strDispName;
    TCHAR szParseName[MAX_PATH];
    TCHAR szSourceFiles[256];
    int i;
    int iBufPos = 0;
    ULONG chEaten;
    ULONG celtFetched;
    size_t ParseNameSize = 0;
    HRESULT hr;
    

    szSourceFiles[0] = '\0';
    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->ParseDisplayName(NULL, NULL, L"c:\\My_Docs", 
         &chEaten, &pidlDocFiles, NULL);
    hr = psfDeskTop->BindToObject(pidlDocFiles, NULL, IID_IShellFolder, 
         (LPVOID *) &psfDocFiles);
    hr = psfDeskTop->Release();

    hr = psfDocFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 
         &ppenum);

    while( (hr = ppenum->Next(1,&pidlItems, &celtFetched)) == S_OK 
       && (celtFetched) == 1)
    {
        psfDocFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, 
            &strDispName);
        StrRetToBuf(&strDispName, pidlItems, szParseName, MAX_PATH);
        
        hr = StringCchLength(szParseName, MAX_PATH, &ParseNameSize);
        
        if (SUCCEEDED(hr))
        {
            for(i=0; i<=ParseNameSize; i++)
            {
                szSourceFiles[iBufPos++] = szParseName[i];
            }
            CoTaskMemFree(pidlItems);
        }
    }
    ppenum->Release();
    
    szSourceFiles[iBufPos] = '\0';

    sfo.hwnd = NULL;
    sfo.wFunc = FO_COPY;
    sfo.pFrom = szSourceFiles;
    sfo.pTo = "c:\\My_Docs2\0";
    sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;

    hr = SHFileOperation(&sfo);
    
    SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH, (LPCVOID) "c:\\My_Docs2", 0);

    CoTaskMemFree(pidlDocFiles);
    psfDocFiles->Release();

    return 0;
}

L'applicazione recupera prima un puntatore all'interfaccia IShellFolder del desktop. Recupera quindi il PIDL della directory di origine passando il percorso completo a IShellFolder::P arseDisplayName. Si noti che IShellFolder::P arseDisplayName richiede che il percorso della directory sia una stringa Unicode. L'applicazione associa quindi alla directory di origine e usa l'interfaccia IShellFolder per recuperare l'interfaccia IEnumIDList di un oggetto enumeratore.

Poiché ogni file nella directory di origine viene enumerato, viene usato IShellFolder::GetDisplayNameOf per recuperare il nome. Il flag SHGDN_FORPARSING è impostato, che causa la restituzione del percorso completo del file da parte di IShellFolder::GetDisplayNameOf . I percorsi di file, inclusi i caratteri NULL terminanti, vengono concatenati in una singola matrice, szSourceFiles. Un secondo carattere NULL viene aggiunto al percorso finale per terminare correttamente la matrice.

Al termine dell'enumerazione, l'applicazione assegna valori a una struttura SHFILEOPSTRUCT . Si noti che la matrice assegnata a pTo per specificare la destinazione deve essere terminata anche da un valore NULL doppio. In questo caso, è semplicemente incluso nella stringa assegnata a pTo. Poiché si tratta di un'applicazione console, le FOF_SILENT, le FOF_NOCONFIRMATION e i flag di FOF_NOCONFIRMMKDIR vengono impostati per eliminare eventuali finestre di dialogo che potrebbero essere visualizzate. Dopo aver restituito SHFileOperation , SHChangeNotify viene chiamato per notificare la shell della modifica. L'applicazione esegue quindi la normale pulizia e restituisce.

Aggiunta di file all'elenco di documenti recenti della shell

Shell gestisce un elenco di documenti aggiunti o modificati di recente per ogni utente. L'utente può visualizzare un elenco di collegamenti a questi file facendo clic su Documenti nel menu Start. Come in Documenti personali, ogni utente ha una directory del file system per contenere i collegamenti effettivi. Per recuperare il PIDL della directory Recente dell'utente corrente, l'applicazione può chiamare SHGetFolderLocation con CSIDL_RECENT o chiamare SHGetFolderPath per recuperare il percorso.

L'applicazione può enumerare il contenuto della cartella Recenti usando le tecniche descritte in precedenza in questo documento. Tuttavia, un'applicazione non deve modificare il contenuto della cartella come se fosse una normale cartella del file system. In tal caso, l'elenco di documenti recenti di Shell non verrà aggiornato correttamente e le modifiche non verranno riflesse nel menu Start. Per aggiungere invece un collegamento al documento alla cartella Recente di un utente, l'applicazione può chiamare SHAddToRecentDocs. Shell aggiungerà un collegamento alla cartella del file system appropriata, nonché l'aggiornamento dell'elenco dei documenti recenti e del menu Start. È anche possibile usare questa funzione per cancellare la cartella.