Windows: ¿Cómo canonizar un archivo a la carpeta especial?
Quiero persistir algunos nombres de archivo para el usuario (por ejemplo, archivos recientes).
Usemos seis archivos de ejemplo:
c:\Documents & Settings\Ian\My Documents\Budget.xls
c:\Documents & Settings\Ian\My Documents\My Pictures\Daughter's Winning Goal.jpg
c:\Documents & Settings\Ian\Application Data\uTorrent
c:\Documents & Settings\All Users\Application Data\Consonto\SpellcheckDictionary.dat
c:\Develop\readme.txt
c:\Program Files\Adobe\Reader\WhatsNew.txt
Ahora estoy codificando la ruta a carpetas especiales. Si el usuario redirige sus carpetas, vaga a otra computadora o actualiza su sistema operativo, las rutas se romperán:
Quiero ser un buen desarrollador y convertir estos codificadosabsoluto caminos arelativo caminos desde el apropiadocarpetas especiales:
%CSIDL_Personal%\Budget.xls
%CSIDL_MyPictures%\Daughter's Winning Goal.jpg
%CSIDL_AppData%\uTorrent
%CSIDL_Common_AppData%\Consonto\SpellcheckDictionary.dat
c:\Develop\readme.txt
%CSIDL_Program_Files%\Adobe\Reader\WhatsNew.txt
La dificultad viene con el hecho de que puede haber múltiples representaciones para el mismo archivo, por ejemplo:
c:\Documents & Settings\Ian\My Documents\My Pictures\Daughter's Winning Goal.jpg
%CSIDL_Profile%\My Documents\My Pictures\Daughter's Winning Goal.jpg
%CSIDL_Personal%\My Pictures\Daughter's Winning Goal.jpg
%CSIDL_MyPictures%\Daughter's Winning Goal.jpg
Tenga en cuenta también que en Windows XPMis fotos se almacenanen My Documents
:
%CSIDL_Profile%\My Documents
%CSIDL_Profile%\My Documents\My Pictures
Pero en Vista / 7 están separados:
%CSIDL_Profile%\Documents
%CSIDL_Profile%\Pictures
Nota: me doy cuenta de la sintaxis%CSIDL_xxx%\filename.ext
no es válido; que Windows no expandirá esas palabras clave como si fueran cadenas de entorno. Solo lo estoy usando para hacer esta pregunta. Internamente, obviamente almacenaría los artículos de otra manera, tal vez comoCSIDL
padre y la cola del camino, por ejemplo:
CSIDL_Personal \Budget.xls
CSIDL_MyPictures \Daughter's Winning Goal.jpg
CSIDL_AppData \uTorrent
CSIDL_Common_AppData \Consonto\SpellcheckDictionary.dat
-1 c:\Develop\readme.txt (-1, since 0 is a valid csidl)
CSIDL_Program_Files \Adobe\Reader\WhatsNew.txt
La pregunta es, ¿cómo usar, en la medida de lo posible, las rutas relativas a las carpetas especiales canónicas?
Estoy pensando:
void CanonicalizeSpecialPath(String path, ref CSLID cslid, ref String relativePath)
{
return "todo";
}
Ver tambiénMSDN:Enumeración CSIDLNueva cosa vieja:Cuidado con los perfiles de usuario itinerantesNueva cosa vieja:Tenga cuidado con las carpetas redirigidas tambiénMSDN:Función PathCanonicalize