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.xlsc:\Documents & Settings\Ian\My Documents\My Pictures\Daughter's Winning Goal.jpgc:\Documents & Settings\Ian\Application Data\uTorrentc:\Documents & Settings\All Users\Application Data\Consonto\SpellcheckDictionary.datc:\Develop\readme.txtc:\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.datc:\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

Respuestas a la pregunta(2)

Su respuesta a la pregunta