Windows: Как канонизировать файл в специальную папку?
Я хочу сохранить некоторые имена файлов для пользователя (например, последние файлы).
Давайте использовать шесть примеров файлов:
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
я сейчас жестко прописал путь к специальным папкам. Если пользователь перенаправит свои папки, переместится на другой компьютер или обновит свою операционную систему, пути будут нарушены:
я хочу быть хорошим разработчиком, и конвертировать эти жестко закодированныеабсолютный пути кродственник пути из соответствующегоспециальные папки:
%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
Трудность заключается в том, что для одного и того же файла может быть несколько представлений, например:
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