Короткая версия
Существует ли IShellItem , который соответствует всему профилю пользователя?
Или с учетом всех известных констант KNOWNFOLDER:
- есть ли способ узнать, является ли константа KNOWNFOLDER частью профиля пользователя
- есть ли способ перечислить константы KNOWNFOLDER, которые еще не были изобретены, поэтому я не пропускаю ни одной?
Длинная версия
Если бы я хотел сделать резервную копию всего профиля пользователя, конечно, я бы начал с
SHGetFolderPath(CSIDL_PROFILE): "C:\Users\Ian"
это очевидно. Эта папка обычно будет содержать:
C:\Users\Ian
╰── AppData
├── Local
├── LocalLow
╰── Roaming
Некоторые из этих других папок уже существуют как собственные CSIDL константы
C:\Users\Ian CSIDL_Profile
╰── AppData
├── Local
├── LocalLow CSIDL_Local_AppData
╰── Roaming CSIDL_AppData
Существуют также другие папки профиля, которые иногда появляются в папке Профиль :
C:\Users\Ian CSIDL_Profile
├── Desktop CSIDL_DesktopDirectoy
├── Documents CSIDL_Personal
├── Pictures CSIDL_MyPictures
├── Music CSIDL_MyMusic
├── Video CSIDL_MyVideo
├── Favorites CSIDL_Favorites
╰── AppData
├── Local
├── LocalLow CSIDL_Local_AppData
╰── Roaming CSIDL_AppData
Но эти папки не обязательно должны быть под% USERPROFILE%
Windows позволяет пользователям настраивать определенные специальные папки для перемещения в пользовательские места:

Это означает, что определенные папки могут фактически существовать вне папки "Profile" :
C:\Users\Ian CSIDL_Profile
╰── AppData
├── Local CSIDL_Local_AppData
╰── LocalLow
D:\Users\Ian
├── Desktop CSIDL_DesktopDirectoy
├── Documents CSIDL_Personal
├── Pictures CSIDL_MyPictures
├── Music CSIDL_MyMusic
├── Video CSIDL_MyVideo
├── Favorites CSIDL_Favorites
╰── AppData
╰── Roaming CSIDL_AppData
И есть целый ряд CSIDL значений, которые я не знаю, могут ли они или не могут, либо через пользовательский интерфейс, групповую политику, либо иным образом перемещаться в другие места:
C:\Users\Ian CSIDL_Profile
╰── AppData
├── Local CSIDL_Local_AppData
│ ├── Microsoft\Windows\History CSIDL_HISTORY
│ ├── Microsoft\Windows\Temporary Internet Files CSIDL_INTERNET_CACHE
│ ╰── Microsoft\Windows\Burn\Burn1 CSIDL_CDBURN_AREA
╰── LocalLow
D:\Users\Ian
├── Desktop CSIDL_DesktopDirectoy
├── Documents CSIDL_Personal
├── Pictures CSIDL_MyPictures
├── Music CSIDL_MyMusic
├── Video CSIDL_MyVideo
├── Favorites CSIDL_Favorites
╰── AppData
╰── Roaming CSIDL_AppData
╰── Microsoft
╰── Windows
├── Recent CSIDL_RECENT
├── Send To CSIDL_SENDTO
├── Start Menu CSIDL_STARTMENU
│ ╰── Programs CSIDL_PROGRAMS
│ ├── Startup CSIDL_STARTUP
│ ├── Startup CSIDL_ALTSTARTUP
│ ╰── Administrative Tools CSIDL_ADMINTOOLS
├── Templates CSIDL_TEMPLATES
╰── Cookies CSIDL_TEMPLATES
Я не хочу пропустить папки
Со всеми этими значениями CSIDL я мог бы пропустить некоторые папки, которые составляют профиль пользователя. В моем идеальном фэнтезийном мире был бы IShellItem , который соответствует практически всему в профиле пользователя.
Точно так же, как если вы посмотрите на папку This PC (CSIDL_DRIVES
) (, ранее известную как My Computer ) , это виртуальная оболочка, содержащая:
This PC
├── 3D Objects
├── Desktop
├── Documents
├── Downloads
├── Music
├── Pictures
╰── Videos
Это прекрасно; это виртуальная папка, содержащая папки, которые составляют профиль пользователя (независимо от того, где эти папки могут быть на самом деле).

К сожалению, у этого есть два недостатка:
- он пропускает некоторые папки профиля (например, CSIDL_Foving)
затем он продолжает включать все Мой компьютер (урожд. Этот ПК )
This PC
├── 3D Objects
├── Desktop
├── Documents
├── Downloads
├── Music
├── Pictures
├── Videos
├── OS (C:)
├── Develop (D:)
├── DVD RW Drive (E:)
├── BD ROM Drive (F:)
╰── Local Disk (X:)
«Так что просто сделайте резервную копию всех CSIDL, которые представляют папки для каждого пользователя»
Полагаю, тогда я мог бы просто посмотреть на каждый CSIDL, отбросить любые IShellItem , которые являются потомками другого IShellItem (todo: выяснить, как это сделать), а затем только резервное копирование тех:
CSIDL_PROFILE C:\Users\ian
CSIDL_LOCAL_APPDATA C:\Users\ian\AppData\Local
CSIDL_APPDATA C:\Users\ian\AppData\Roaming
CSIDL_NETHOOD C:\Users\ian\AppData\Roaming\Microsoft\Windows\Network Shortcuts
CSIDL_PRINTHOOD C:\Users\ian\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
CSIDL_DESKTOP D:\Users\ian\Desktop
CSIDL_DESKTOPDIRECTORY D:\Users\ian\Desktop
CSIDL_PERSONAL D:\Users\ian\Documents
CSIDL_MYPICTURES D:\Users\ian\Pictures
CSIDL_MYMUSIC D:\Users\ian\Music
CSIDL_MYVIDEO D:\Users\ian\Videos
CSIDL_FAVORITES D:\Users\ian\Favorites
CSIDL_COMMON_FAVORITES D:\Users\ian\Favorites
CSIDL_RECENT d:\Users\ian\AppData\Roaming\Microsoft\Windows\Recent
CSIDL_SENDTO d:\Users\ian\AppData\Roaming\Microsoft\Windows\SendTo
CSIDL_STARTMENU d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu
CSIDL_PROGRAMS d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
CSIDL_STARTUP d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
CSIDL_ALTSTARTUP d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
CSIDL_ADMINTOOLS d:\Users\ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
CSIDL_TEMPLATES d:\Users\ian\AppData\Roaming\Microsoft\Windows\Templates
CSIDL_COOKIES d:\Users\ian\AppData\Roaming\Microsoft\Windows\Cookies
CSIDL_HISTORY d:\Users\ian\AppData\Local\Microsoft\Windows\History
CSIDL_INTERNET_CACHE d:\Users\ian\AppData\Local\Microsoft\Windows\Temporary Internet Files
CSIDL_CDBURN_AREA C:\Users\ian\AppData\Local\Microsoft\Windows\Burn\Burn1
Проблема в том, что CSIDL являются неполными (и устарели). Например:
- CSIDL для отсутствует * Загрузки
- нет CSIDL для 3D-объектов
Хорошо, я переключусь на современные ЗНАНИЯ .
Таким образом, я получу:
- FOLDERID_AccountPictures
- FOLDERID_AppDataDesktop
- FOLDERID_AppDataFavorites
- FOLDERID_AppDataProgramData
- FOLDERID_OriginalImages
- отрывок 34
- FOLDERID_Ringtones
Кроме KnownFolders не помогает
Моя схема перечисления всех известных KNOWNFOLDER сбоев по двум причинам.
Любые константы, которые изобрели после написания моего приложения, будут пропущены - пропущено резервное копирование данных профиля пользователя. Не очень хорошая работа для приложения резервного копирования.
Но даже больше того, что я не знаю , которые ЗНАНИЯ на пользователя . Например:
- FOLDERID_AppsFolder
- GUID : GUID {1e87508d-89c2-42f0-8a7e-645a0f50ca58}
- Отображаемое имя : Приложения
- Тип папки : VIRTUAL
- Путь по умолчанию : Неприменимо - виртуальная папка
Являются ли Приложения для каждого пользователя? То, что папка не имеет пути к файловой системе, не означает, что она не существует, или что я не могу ее прочитать, или что я не могу перечислить ее файлы, или что я не могу сделать резервную копию его содержание
При использовании современного (т. Е. Windows 95) Shell API для перечисления файлов и папок вы можете просто читать эти файлы.
Подключите ваш мобильный телефон через USB к вашему ПК. Вы можете просматривать файлы и перечислять их с помощью IShellItem api - даже если у них нет пути к файловой системе.
Резюме
Существует ли виртуальная папка оболочки, которая соответствует всему , связанному с профилем пользователя?