Windows - Directory di Sistema e Variabili






Le cartelle speciali di Windows
a cura di Alessandro Del Sole (requisiti: conoscenza generica di VB e di API)

Leggendo alcune delle e-mail inviate dagli utenti alla mailing list del sito, ho notato che alcuni fanno confusione o hanno dei dubbi in relazione alle cartelle di sistema.

Innanzitutto va fatto un piccolo cenno "storico", ricordando che gia' con l'introduzione di Windows 3.1, il sistema operativo si basava su delle cartelle predefinite, e questo concetto si e' evoluto con le successive versioni del sistema operativo stesso, con la presenza di cartelle quali "Programmi", "File Comuni","Preferiti" ed altre che poi esamineremo, che non necessariamente debbono avere questi nomi, o che possono avere una denominazione diversa a seconda del Paese in cui ci si trova.

Spesso, quindi, ci si trova a voler conoscere una delle cartelle speciali di Windows per poter compiere delle operazioni indipendentemente, ad esempio, dal nome della stessa o dal Paese in cui ci si trova. La cartella "Programmi" potrebbe infatti chiamarsi "My Programs", oppure, come accade in diversi Stati, "Program Files", pertanto puo' tornare utile al programmatore conoscere il nome della cartella speciale sul computer dell'utente della propria applicazione.

Per far questo abbiamo due possibilita':

Ricorrere al Microsoft (r) Scripting Runtime, che si puo' selezionare dal Menu Progetto, alla voce "Riferimenti". Questo metodo pero', a mio avviso, e' poco efficace perche' consente di conoscere solo la cartella di Windows, quella di Sistema (generalmente Windows\System) e quella temporanea (generalmente Windows\Temp)
Utilizzare le API di Windows, in particolare la funzione ShGetFolderPath, definita nella libreria ShFolder.dll.
In questo articolo approfondiremo il secondo caso, dando comunque un breve cenno al primo.

UTILIZZARE L'API SHGETFOLDERPATH
La funzione ShGetFolderPath viene definita in Visual Basic in questo modo:

Declare Function SHGetFolderPath Lib "shfolder.dll" Alias "SHGetFolderPathA" _
(ByVal hwndOwner As Long, ByVal nFolder As Long, _
ByVal hToken As Long, ByVal dwReserved As Long, _
ByVal lpszPath As String) As Long

A seconda dell'utilizzo verra' dichiarata pubblica (in un modulo o modulo di classe) o privata (in un form o modulo di classe).

La funzione permette di conoscere con esattezza il nome delle cartelle speciali. Esaminiamo ora i parametri:

PARAMETRO SIGNIFICATO
HwndOwner E' l'handle alla finestra dalla quale parte la richiesta, se ad esempio utilizziamo un form, sara' Form1.hWnd
NFolder Valore di tipo Long che identifica la cartella speciale da conoscere, pi- avanti ne esamineremo i valori
HToken Simbolo che identifica l'utente, di norma e' uguale a 0
DwReserved Valore di tipo Long che specifica se deve essere restituito il valore corrente della cartella (=0) o il valore di default della cartella (=0). Di norma si usa 0. Si utilizza la costante SHGFP_TYPE_DEFAULT (vedi esempio)
LpszPath E' la stringa che contiene il nome della cartella ed e' lunga max. 260 caratteri

Prima di vedere un esempio pratico specifichiamo i flags di tipo Long che identificano la cartella da cercare. Questi flags vengono definiti anche CSIDL:

CSIDL_ALTSTARTUP = &H1D Cartella Startup non localizzata
CSIDL_APPDATA = &H1A Cartella Application Data utilizzata per dati comuni a pi- programmi
CSIDL_BITBUCKET = &HA Il Cestino posizionato sul desktop
CSIDL_CONTROLS = &H3 Pannello di controllo
CSIDL_COOKIES = &H21 Cartella dei cookies
CSIDL_DESKTOP = &H0 Desktop di Windows
CSIDL_DESKTOPDIRECTORY = &H10 La cartella fisica del Desktop di Windows
CSIDL_DRIVES = &H11 Risorse del Computer
CSIDL_FAVORITES = &H6 Cartella "Preferiti"
CSIDL_FONTS = &H14 Cartella dei "Fonts" installati
CSIDL_HISTORY = &H22 Cronologia di Internet Explorer
CSIDL_INTERNET = &H1 Internet (icona di Internet Explorer sul desktop)
CSIDL_INTERNET_CACHE = &H20 Cache di Internet Explorer
CSIDL_LOCAL_APPDATA = &H1C Cartella locale delle applicazioni con IE 5.0 o superiore.
CSIDL_MYPICTURES = &H27 Cartella "Immagini" sotto Documenti
CSIDL_NETHOOD = &H13 Cartella Nethood
CSIDL_NETWORK = &H12 Cartella Network Neighbourhood
CSIDL_PERSONAL = &H5 Cartella "Documenti"
CSIDL_PRINTERS = &H4 Cartella "Stampanti"
CSIDL_PRINTHOOD = &H1B Cartella collegamenti delle stampanti.
CSIDL_PROFILE = &H28 Cartella per il profilo utente.
CSIDL_PROGRAM_FILES = &H26 Cartella "Programmi"
CSIDL_PROGRAM_FILES_COMMON = &H2B Solo Windows NT, 2000 la cartella Comuni sotto Programmi.
CSIDL_PROGRAM_FILES_COMMONX86 = &H2C Solo Windows 2000: la cartella Comuni sotto Programmi su sistemi x86 RISC.
CSIDL_PROGRAM_FILESX86 = &H2A Solo Windows 2000: la cartella Programmi x86 su sistemi RISC.
CSIDL_PROGRAMS = &H2 La cartella Programmi del menu Avvio
CSIDL_RECENT = &H8 Menu Dati Recenti
CSIDL_SENDTO = &H9 Cartella "Send To"
CSIDL_STARTMENU = &HB Menu Avvio
CSIDL_STARTUP = &H7 Cartella Startup del menu Avvio\Programmi
CSIDL_SYSTEM = &H25 Cartella di Sistema di Windows.
CSIDL_TEMPLATES = &H15 Cartella "Templates"
CSIDL_WINDOWS = &H24 Cartella di Windows
CSIDL_ADMINTOOLS = &H30 In Windows 2000 e' la cartella Administration Tools.
CSIDL_COMMON_ADMINTOOLS = &H2F In Windows 2000 cartella Administration tools comune a tutti gli utenti.
CSIDL_COMMON_APPDATA = &H23 Cartella Application Data comune a tutti gli utenti (solo Win 2000).
CSIDL_COMMON_ALTSTARTUP = &H1D Solo in Windows NT, 2000: cartella Startup comune a tutti gli utenti.
CSIDL_COMMON_DESKTOPDIRECTORY = &H19 Solo in Windows NT, 2000 la cartella Desktop comune a tutti gli utenti
CSIDL_COMMON_DOCUMENTS = &H2E Solo in Windows NT, 2000: la cartella Documenti comune a tutti.
CSIDL_COMMON_FAVORITES = &H1F Solo in Windows NT, 2000: la cartella "Preferiti" comune a tutti
CSIDL_COMMON_PROGRAMS = &H17 Solo in Windows NT, 2000: la cartella Programmi del Menu Avvio comune a tutti.
CSIDL_COMMON_STARTMENU = &H16 Solo in Windows NT, 2000: la cartella del Menu Avvio comune a tutti.
CSIDL_COMMON_STARTUP = &H18 Solo in Windows NT, 2000 la cartella "Startup" comune a tutti.
CSIDL_COMMON_TEMPLATES = &H2D Solo in Windows NT, 2000 la cartella "Templates" comune a tutti
CSIDL_SYSTEMX86 = &H29 Windows 2000: La cartella x86 su sistemi RISC.

Una volta individuato tra questi il flag della cartella da conoscere, siamo pronti ad utilizzare la funzione. Eccone un breve esempio, supponendo di lavorare in un form e di voler conoscere la cartella speciale "Programmi":

Private Declare Function SHGetFolderPath Lib "shfolder.dll" Alias "SHGetFolderPathA" _
(ByVal hwndOwner As Long, ByVal nFolder As Long, _
ByVal hToken As Long, ByVal dwReserved As Long, _
ByVal lpszPath As String) As Long

Const CSIDL_PROGRAM_FILES = &H26

Const SHGFP_TYPE_CURRENT = 0

Dim NomeCartella as String ' Stringa che riceve il nome della cartella
Dim risultato as long ' riceve il risultato dell'operazione

Private Sub GetPath()

NomeCartella=Space(259) 'Delimita lunghezza della stringa

Risultato = shGetFolderPath (me.hWnd, CSIDL_PROGRAM_FILES, 0, _
SHGFP_TYPE_CURRENT, NomeCartella) 'Legge la cartella

If risultato <> &H0 then exit sub 'se errore, esce

' Ricava il nome della cartella:


' Poiche' abbiamo dato un margine di 260 caratteri, i caratteri non utilizzati

' vengono "marcati" come spazi, quindi vanno eliminati:


NomeCartella = rtrim(NomeCartella)

' Poiche' l'ultimo carattere della stringa e' NULL, va eliminato:


NomeCartella = left(NomeCartella,len(NomeCartella)-1)

' Visualizza nella finestra Debug il nome della cartella, pronto per l'utilizzo

Debug.Print NomeCartella

End Sub

La funzione restituisce un valore di tipo Long, e ci sono tre possibilita':

S_OK = &H0 Operazione eseguita correttamente
S_FALSE = &H1 il flag della cartella e' corretto, ma si tratta di una cartella "logica" e non "fisica".
E_INVALIDARG = &H80070057 Il flag immesso della cartella non e' valido.

UTILIZZARE MICROSOFT (r) SCRIPTING RUNTIME
Se non si ha la necessita' di conoscere cartelle estremamente particolari, ma si vuole conoscere una delle seguenti cartelle:

Windows
System
Temp
E' possibile ricorrere alla dll Scripting Runtime, accessibile, come gia' detto dal menu "Progetto/Riferimenti".

L'oggetto che ci permette di conoscere le cartelle e' il FileSystemObject, in particolare ne utilizzeremo il metodo "GetSpecialFolder", che utilizza le seguenti costanti:

WindowsFolder (Windows)
SysFolder (Sistema)
TemporaryFolder (Temp)

Nel corpo, (modulo o form) scriviamo il seguente codice:

Dim FSO as New FileSystemObject
Dim TempPath as String, SysPath as String, WinPath as String
Private Sub LeggeSpeciali()
TempPath = FSO.GetSpecialFolder(TemporaryFolder)
SysPath=FSO.GetSpecialFolder(SystemFolder)
WinPath=FSO.GetSpecialFolder(WindowsFolder)
End Sub

Per eventuali chiarimenti o domande, potete scrivere all'autore: Alessandro Del Sole o visitare la sua pagina Web

L'autore
Alessandro Del Sole e' nato a Roma 24 anni fa. Ha cominciato a programmare nel 1989 con il QuickBasic 4.5, passando per Turbo Pascal e Turbo C. Attualmente programma in Visual Basic dedicandosi,in particolare, allo studio delle Api e alla manipolazione delle immagini. Sta iniziando lo studio del Visual C++.
E' l'autore del sorgente per creare un'immagine EMF derivata da una Bitmap, senza uso di OCX o DLL esterne.










( windowsdirectorydisistemaevariabili.html )- by Paolo Puglisi - Modifica del 17/12/2023