He visto demasiados programas, utilerías y software en general que todavía intentan adivinar o equivocadamente predefinen el path o ruta a folders especiales de Windows, como Program Files, Documents and Settings, etc. Esto puede resultar en dos cosas, cualquiera de las dos muy molestas y muy mal vistas:
- El programa no funciona.
- El programa termina creando folders no deseados en el sistema.
El #2 es especialmente molesto…¿para que sirve que instale Windows en Ingles, si un programa mal hecho va a terminar creando H:\Archivos de Programa de todas maneras?
Es simplemente pésimo diseño de software el asumir y programar software contra la suposición de que el usuario que está corriendo nuestra aplicación instaló Windows en el mismo Disco Lógico que nosotros. Las empresas generalmente instalan Windows en cualquier directorio excepto C:\Windows, precisamente porque muchos virus, troyanos, etc. fabricados por amateurs solo intentan instalarse contra C:\Windows, así que instalar Windows en un directorio diferente al predeterminado es una simple protección extra. Es por esto que un desarrollador nunca debe intentar adivinar la ruta a un folder especial de Windows.
Microsoft, en el namespace System, provee un metodo y una enumeration en conjunto que permite obtener directamente de Windows el path/ruta a varios folders especiales de Windows:
El metodo es estático, y se llama Environment.GetFolderPath, que recibe como parámetro un enum de tipo Environment.SpecialFolder.
Los valores del enumeration Environment.SpecialFolder son:
- ApplicationData
- CommonApplicationData
- Cookies
- Desktop
- Favorites
- History
- InternetCache
- Programs
- MyComputer
- MyMusic
- MyPictures
- Recent
- SendTo
- StartMenu
- Startup
- System
- Templates
- DesktopDirectory
- Personal
- MyDocuments
- ProgramFiles
- CommonProgramFiles
Ver detalles en MSDN sobre System.Environment.SpecialFolders
Ver detalles en MSDN sobre System.Environment.GetFolderPath
La forma correcta de obtener el path al folder de Program Files, seria entonces:
string programFilesPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
lo cual, en mi sistema, resultaría en “H:\Program Files”.