Как получить путь к AppData - PullRequest
       3

Как получить путь к AppData

1 голос
/ 03 февраля 2012
SHGetSpecialFolderPathA(NULL,buffer, CSIDL_APPDATA,FALSE );

C:\Users\guest\AppData\Roaming

SHGetSpecialFolderPathA(NULL,buffer, CSIDL_LOCAL_APPDATA,FALSE );

C:\Users\guest\AppData\Local

Есть ли способ получить путь C:\Users\guest\AppData, используяWindows API?

1 Ответ

3 голосов
/ 03 февраля 2012

Роуминг и локальные папки существуют по определенной причине, иногда вам может понадобиться поместить что-то в корень профиля, но на самом деле вы не должны этого делать.Вот что 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...