Роуминг и локальные папки существуют по определенной причине, иногда вам может понадобиться поместить что-то в корень профиля, но на самом деле вы не должны этого делать.Вот что MSDN говорит о CSIDL_PROFILE:
Приложения не должны создавать файлы или папки на этом уровне;они должны поместить свои данные в местоположения, указанные CSIDL_APPDATA или CSIDL_LOCAL_APPDATA.Однако, если вы создаете новую Известную папку, корень профиля, на который ссылается CSIDL_PROFILE, является подходящим.
В NT5 у них даже нет той же самой родительской папки, и «Роуминг» находится в корнепрофиль:
C:\Documents and Settings\username\Application Data
C:\Documents and Settings\username\Local Settings\Application Data
Пользователь и / или администратор домена могут перемещать и / или перенаправлять эти папки в любое место, в корень другого диска или в общий сетевой ресурс.
Единственныйдокументированный способ найти родителя - это использовать IKnownFolderManager :: GetFolder , а затем вызвать IKnownFolder::GetFolderDefinition
и посмотреть на KNOWNFOLDER_DEFINITION.fidParent
(Имейте в виду, что не обязательно быть родителем, IKnownFolderManager:: Redirect принимает строку в качестве цели, поэтому перенаправленная папка может быть где угодно)
Если вы хотите исключить файлы из специальной папки оболочки, вам следует сравнить путь с чем-то вроде PathCommonPrefix или IKnownFolderManager :: FindFolderFromPath .