Algunas carpetas especiales de Windows | The Windows club
Que tal:
Windows genera muchas carpetas para usos especiales, sin embargo pocas veces se menciona su ubicación y muchas veces pasa desapercibida su existencia. En esta ocasión voy a mostrar como obtener la ruta de esas "carpetas especiales" desde VB.Net pero usando el registro de Windows para obtener la ruta de las mismas. En un segundo artículo mostraré como obtener algunas carpetas extras pero de la manera "clásica", es decir desde la ruta del usuario y concatenando los nombres de las carpetas.
El código fuente es el siguiente y paso a continuación a explicarlo:
'#### Purpose: Show path
'#### Created date: 15/09/2019
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 15/09/2019
'#### Last modified username: Juan Manuel Mar Hdz.
Sub Button1Click(sender As Object, e As EventArgs)
MsgBox(getPersonalFolderPath)
End Sub
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 16/12/2015
'#### Last modified username: Juan Manuel Mar Hdz.
'#### Thanks to http://www.satalketo.co.uk/vbnet-articles/get-the-associated-application-for-a-file-extension
Private Function getSpecialFolderPath(specialfoldername As String) As String
Dim rtn As String = ""
Dim key As Microsoft.Win32.RegistryKey
If specialfoldername.IsNullOrEmpty(specialfoldername) = True Then
Return ""
Else
key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders")
If specialfoldername.Trim = "{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'saved games
ElseIf specialfoldername.Trim = "{7D1D3A04-DEBB-4115-95CF-2F29DA2920DA}" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'searches
ElseIf specialfoldername.Trim = "{374DE290-123F-4565-9164-39C4925E467B}" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'downloads
ElseIf specialfoldername.Trim = "{56784854-C6CB-462B-8169-88E350ACB882}" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'contacts
ElseIf specialfoldername.Trim = "{BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968}" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'links
ElseIf specialfoldername.Trim().ToLower = "appdata" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'app data
ElseIf specialfoldername.Trim().ToLower = "cache" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'cache
ElseIf specialfoldername.Trim().ToLower = "cd burning" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'CD Burning
ElseIf specialfoldername.Trim().ToLower = "cookies" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'cookies
ElseIf specialfoldername.Trim().ToLower = "desktop" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'desktop
ElseIf specialfoldername.Trim().ToLower = "favorites" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'favorites
ElseIf specialfoldername.Trim().ToLower = "history" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'history
ElseIf specialfoldername.Trim().ToLower = "local appdata" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'Local AppData
ElseIf specialfoldername.Trim().ToLower = "my music" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'My Music
ElseIf specialfoldername.Trim().ToLower = "my pictures" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'My Pictures
ElseIf specialfoldername.Trim().ToLower = "my video" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'My Video
ElseIf specialfoldername.Trim().ToLower = "nethood" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'NetHood
ElseIf specialfoldername.Trim().ToLower = "personal" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'personal
ElseIf specialfoldername.Trim().ToLower = "printhood" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'PrintHood
ElseIf specialfoldername.Trim().ToLower = "programs" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'programs
ElseIf specialfoldername.Trim().ToLower = "recent" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'recent
ElseIf specialfoldername.Trim().ToLower = "libraries" Then
'libraries
rtn = key.GetValue("recent").ToString().Trim
rtn = rtn.Replace("Recent", "Libraries").Trim
rtn = rtn.Replace("recent", "libraries").Trim
ElseIf specialfoldername.Trim().ToLower = "sendto" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'send to
ElseIf specialfoldername.Trim().ToLower = "start menu" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'Start Menu
ElseIf specialfoldername.Trim().ToLower = "startup" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'start up
ElseIf specialfoldername.Trim().ToLower = "templates" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'templates
Else
rtn = ""
End If
Return rtn
End If
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getSavedGamesFolderPath() As String
Return getSpecialFolderPath("{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getSearchesFolderPath() As String
Return getSpecialFolderPath("{7D1D3A04-DEBB-4115-95CF-2F29DA2920DA}").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getDownloadsFolderPath() As String
Return getSpecialFolderPath("{374DE290-123F-4565-9164-39C4925E467B}").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getContactsFolderPath() As String
Return getSpecialFolderPath("{56784854-C6CB-462B-8169-88E350ACB882}").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getLinksFolderPath() As String
Return getSpecialFolderPath("{BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968}").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getAppDataFolderPath() As String
Return getSpecialFolderPath("AppData").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getCacheFolderPath() As String
Return getSpecialFolderPath("Cache").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getCDBurningFolderPath() As String
Return getSpecialFolderPath("CD Burning").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getCookiesFolderPath() As String
Return getSpecialFolderPath("Cookies").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getDesktopFolderPath() As String
Return getSpecialFolderPath("Desktop").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getFavoritesFolderPath() As String
Return getSpecialFolderPath("Favorites").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getHistoryFolderPath() As String
Return getSpecialFolderPath("History").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getLocalAppDataFolderPath() As String
Return getSpecialFolderPath("Local AppData").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getMyMusicFolderPath() As String
Return getSpecialFolderPath("My Music").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getMyPicturesFolderPath() As String
Return getSpecialFolderPath("My Pictures").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getMyVideoFolderPath() As String
Return getSpecialFolderPath("My Video").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getNetHoodFolderPath() As String
Return getSpecialFolderPath("NetHood").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getPersonalFolderPath() As String
Return getSpecialFolderPath("Personal").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getPrintHoodFolderPath() As String
Return getSpecialFolderPath("PrintHood").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getProgramsFolderPath() As String
Return getSpecialFolderPath("Programs").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getRecentFolderPath() As String
Return getSpecialFolderPath("Recent").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 07/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 07/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getLibrariesFolderPath() As String
Return getSpecialFolderPath("Libraries").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getSendToFolderPath() As String
Return getSpecialFolderPath("SendTo").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getStartMenuFolderPath() As String
Return getSpecialFolderPath("Start Menu").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getStartupFolderPath() As String
Return getSpecialFolderPath("Startup").Trim
End Function
'#### Purpose: Return special folder path
'#### Created date: 01/09/2015
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 01/09/2015
'#### Last modified username: Juan Manuel Mar Hdz.
Private Function getTemplatesFolderPath() As String
Return getSpecialFolderPath("Templates").Trim
End Function
Tenemos entonces una función que al presionar el botón nos muestra la ruta de la carpeta que le indiquemos:
Sub Button1Click(sender As Object, e As EventArgs)
MsgBox(getPersonalFolderPath)
End Sub
En este caso vamos a obtener la ruta de la carpeta de documentos personales del usuario actual (Mis Documentos), hay que aclarar que este método solo está probado en Windows 7 que es sistema operativo que uso, se que en cada versión Microsoft cambia la ruta de "Mis Documentos", pero como no tengo otro Windows de momento no puedo confirmar si esta función trabaja en Windows anteriores o posteriores, si más adelante confirmo problemas se harán las correcciones necesarias.
Ahora bien, al presionar el botón vemos que se llama a la función "getPersonalFolderPath", esta al igual que el resto de las "funciones para obtener las carpetas especiales" solo actuan como puente para la verdadera función: getSpecialFolderPath.
Esta función (getSpecialFolderPath) es la que realmente obtiene la ruta especial, devuelve el valor obtenido a la función que la llamó y entonces se muestra al usuario. Pero alguien preguntará "¿y porque no llamar a esta función directamente en lugar de getSearchesFolderPath, getContactsFolderPath, getAppDataFolderPath, etc?". Bueno, estas funciones originalmente yo las tengo en una clase la cual se comparte entre programas, es decir se reusan las funciones. Para facilitar a otros programadores su uso esta función es privada mientras que el resto son públicas, así solo le doy al programador las funciones base sin tener que preocuparse por como funcionan realmente y eso reduce la complejidad de su uso.
Veamos ahora como funciona getSpecialFolderPath:
En primer lugar obtenemos la llave principal desde el registro a partir de la siguiente ruta:
key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders")
Como podemos ver en la siguiente imagen (clic para ampliar) dentro de esta llave tenemos todas las rutas de las carpetas especiales, lo único que hace falta es obtener el valor de esas llaves secundarias.
Eso es precisamente lo que se hace con las siguientes líneas de código como la siguiente:
If specialfoldername.Trim().ToLower = "cookies" Then
rtn = key.GetValue(specialfoldername.Trim).ToString().Trim 'cookies
End If
Bueno, en realidad es una secuencia de verificaciones, aquí solo estoy ejemplificando si el valor de la variable "specialfoldername" (que es el parámetro que acepta la función getSpecialFolderPath) es igual a cookies entonces obtenemos la ruta de la carpeta especial "cookies" y lo asignaremos a la variable "rtn" para al final devolver el valor de la misma.
Muy sencillo, ¿no?. Como pueden ver hay funciones para devolver la mayor parte de las carpetas especiales de Windows, quedan algunas pendientes como indiqué al principio pero esas se tratarán en un artículo posterior.
Así es como se vería nuestro programa en acción mostrando la ruta de los documentos del usuario:
Conclusiones:
La reutilización de código fuente es una buena práctica dentro de la programación de sistemas, y quise por este medio compartir con todos ustedes algunos de mis trabajos, espero les sean de utilidad y los invito a que sigan visitando este blog.