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. |