Windows: Как канонизировать файл в специальную папку?

Я хочу сохранить некоторые имена файлов для пользователя (например, последние файлы).

Давайте использовать шесть примеров файлов:

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

я сейчас жестко прописал путь к специальным папкам. Если пользователь перенаправит свои папки, переместится на другой компьютер или обновит свою операционную систему, пути будут нарушены:

я хочу быть хорошим разработчиком, и конвертировать эти жестко закодированныеабсолютный пути кродственник пути из соответствующегоспециальные папки:

%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

Трудность заключается в том, что для одного и того же файла может быть несколько представлений, например:

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

Обратите внимание, что в Windows XPМои фотографии хранятсяв My Documents:

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

Но на Vista / 7 они отдельные:

%CSIDL_Profile%\Documents
%CSIDL_Profile%\Pictures

Замечания: я понимаю синтаксис%CSIDL_xxx%\filename.ext не является действительным; что Windows не будет расширять эти ключевые слова, как будто они являются строками среды. Я только использую это как способ задать этот вопрос. Внутренне я бы, очевидно, хранил предметы другим способом, возможно, какCSIDL родитель и хвост пути, например:

 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

Возникает вопрос, как максимально использовать пути относительно канонических специальных папок?

Я думаю:

void CanonicalizeSpecialPath(String path, ref CSLID cslid, ref String relativePath)
{
   return "todo";
}
Смотрите такжеMSDN:Перечисление CSIDLНовая старая вещь:Остерегайтесь перемещаемых пользовательских профилейНовая старая вещь:Остерегайтесь перенаправленных папок тожеMSDN:Функция PathCanonicalize

Ответы на вопрос(2)

Ваш ответ на вопрос