Windows: Como canonizar um arquivo para a pasta especial?

Eu quero persistir alguns nomes de arquivos para o usuário (por exemplo, arquivos recentes).

Vamos usar seis arquivos de exemplo:

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

agora estou codificando o caminho para pastas especiais. Se o usuário redirecionar suas pastas, mover para outro computador ou atualizar seu sistema operacional, os caminhos serão quebrados:

eu quero ser um bom desenvolvedor e converter esses códigosabsoluto caminhos pararelativo caminhos do apropriadopastas especiais:

%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

A dificuldade vem do fato de que pode haver várias representações para o mesmo arquivo, por exemplo:

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

Observe também que no Windows XPMinhas fotos são armazenadosno My Documents:

%CSIDL_Profile%\My Documents
%CSIDL_Profile%\My Documents\My Pictures

Mas no Vista / 7 eles são separados:

%CSIDL_Profile%\Documents
%CSIDL_Profile%\Pictures

Nota: eu percebo a sintaxe%CSIDL_xxx%\filename.ext não é válido; o Windows não expandirá essas palavras-chave como se fossem seqüências de caracteres do ambiente. Eu estou usando apenas como uma maneira de fazer esta pergunta. Internamente, eu obviamente armazenaria os itens de outra maneira, talvez como umCSIDL pai e a cauda do caminho, por exemplo:

 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

A questão passa a ser: como usar, tanto quanto possível, caminhos relativos a pastas especiais canônicas?

Estou pensando:

void CanonicalizeSpecialPath(String path, ref CSLID cslid, ref String relativePath)
{
   return "todo";
}
Veja tambémMSDN:Enumeração CSIDLNova coisa velha:Cuidado com os perfis de usuário móvelNova coisa velha:Cuidado com as pastas redirecionadas tambémMSDN:Função PathCanonicalize

questionAnswers(2)

yourAnswerToTheQuestion